Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.64/11: Рейтинг темы: голосов - 11, средняя оценка - 4.64
192 / 199 / 82
Регистрация: 11.04.2013
Сообщений: 1,086
1

Как заставить JIT откомпилировать весь код сразу?

23.05.2014, 06:58. Показов 2285. Ответов 22
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
При запуске программы возникают тормоза при первом обращении к методам около 3 сек, потом все работает мгновенно

Начал разбираться

Функции JITCompiler известен вызываемый метод и тип, в котором он опреде-
лен. JITCompiler ищет в метаданных соответствующей сборки IL-код вызываемого
метода. Затем JITCompiler проверяет и компилирует IL-код в машинные коман-
ды, которые сохраняются в динамически выделенном блоке памяти. После этого
JITCompiler возвращается к структуре внутренних данных типа, созданной средой
CLR, и заменяет адрес вызываемого метода адресом блока памяти, содержащего
готовые машинные команды. В завершение JITCompiler передает управление коду
в этом блоке памяти.

Рассмотрим повторное обращение методу. К этому моменту код метода уже проверен и скомпилирован, так что обращение к блоку памяти производится напрямую, без вызова JITCompiler.

Снижение производительности наблюдается только при первом вызове метода.
Все последующие обращения выполняются «на максимальной скорости», потому
что повторная верификация и компиляция не производятся.

Как заставить JIT откомпилировать весь код сразу при запуске программы, а не дожидаться пока будет обращение к методу?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
23.05.2014, 06:58
Ответы с готовыми решениями:

Как заставить код принять с консоли сразу несколько переменных?
Никак не могу заставить его брать сразу несколько переменных с консоли в части кода: for (int x...

Как заставить QMdiArea заполнять весь CentralWidet в Designer?
Привет! Недавно начал изучать Qt. Сейчас пытаюсь написать первое MDI приложение. У меня есть...

Программно заставить откомпилировать *.pas файл
Нужно чтобы программа, пользуясь каким-либо компилятором после выбора файла (например через...

Откомпилировать код как DLL
Я меня получается создать длл-ку, если я с нуля пишу сам и заголовочный файл, и саму спп-шку. Но...

22
995 / 893 / 354
Регистрация: 24.03.2014
Сообщений: 2,381
Записей в блоге: 2
23.05.2014, 07:20 2
ngen
1
192 / 199 / 82
Регистрация: 11.04.2013
Сообщений: 1,086
23.05.2014, 07:57  [ТС] 3
Spawn, не так не вариант, ибо придется бегать от компа к компу при установке , либо писать инсталятор

еще есть варианты?

Добавлено через 13 минут
Имеется ввиду может есть какие то директивы или атрибуты заставляющие JIT скомпилировать весь код (либо нужные методы) на стадии запуска программы?
0
995 / 893 / 354
Регистрация: 24.03.2014
Сообщений: 2,381
Записей в блоге: 2
23.05.2014, 09:08 4
Цитата Сообщение от EVG-1980 Посмотреть сообщение
Имеется ввиду может есть какие то директивы или атрибуты заставляющие JIT скомпилировать весь код (либо нужные методы) на стадии запуска программы?
Т.е. пересборка всей программы с добавленными атрибутами не потребует переустановки у пользователей?)
JIT не сразу даже весь метод может в нативный код превратить, так что каким-нибудь reflection тут не спасёшься...

Поискать в чём причина тормозов не пробовали?
0
192 / 199 / 82
Регистрация: 11.04.2013
Сообщений: 1,086
23.05.2014, 09:50  [ТС] 5
Цитата Сообщение от Spawn Посмотреть сообщение
Поискать в чём причина тормозов не пробовали?
Клиент серверное приложение, при первом запуске клиента набираю сообщение жму отправить подтверждение доставки приходит через 3 секунды , при последующих оправках подтверждение приходит мгновенно где искать если в методах ReceiveCallback и SendCallBack всего по три строчки кода и ничего лишнего нет?
0
995 / 893 / 354
Регистрация: 24.03.2014
Сообщений: 2,381
Записей в блоге: 2
23.05.2014, 09:51 6
EVG-1980, WCF или что за технология получения/передачи?
0
192 / 199 / 82
Регистрация: 11.04.2013
Сообщений: 1,086
23.05.2014, 10:02  [ТС] 7
Spawn, обычные асинхронные сокеты
0
1274 / 975 / 113
Регистрация: 12.01.2010
Сообщений: 1,971
23.05.2014, 10:20 8
возьми да вызови этот метод вручную, пусть там первая же проверка на null сделает return
а вообще есть что-то такое, видел какой-то атрибут для методов на эту тему...сам вспомнить хотел недавно, но не вышло )
0
995 / 893 / 354
Регистрация: 24.03.2014
Сообщений: 2,381
Записей в блоге: 2
23.05.2014, 10:32 9
Так, сервер:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
        TcpListener listener = new TcpListener(12345);
        private async void Form1_Load(object sender, EventArgs e)
        {
            Text = "Started";
            listener.Start();
            Socket sock = await listener.AcceptSocketAsync();
            Text = "Connected";
            Decoder dec = Encoding.UTF8.GetDecoder();
            while (true)
            {
                int available = sock.Available;
                if (available > 0)
                {
                    byte[] buffer = new byte[available];
                    sock.Receive(buffer);
                    int charCount = dec.GetCharCount(buffer, 0, buffer.Length);
                    if (charCount > 0)
                    {
                        char[] chars = new char[charCount];
                        dec.GetChars(buffer, 0, buffer.Length, chars, 0);
                        textBox1.AppendText(new string(chars));
                    }
                }
                await Task.Delay(100);
            }
        }
Клиент:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
        TcpClient client = new TcpClient();
        private async void Form1_Load(object sender, EventArgs e)
        {
            Text = "Started";
            await client.ConnectAsync("localhost", 12345);
            Text = "Connected";
            button1.Enabled = true;
        }
 
        private async void button1_Click(object sender, EventArgs e)
        {
            textBox1.ReadOnly = true;
            if (textBox1.TextLength > 0)
            {
                var args = new SocketAsyncEventArgs();
                byte[] data = Encoding.UTF8.GetBytes(textBox1.Text);
                args.SetBuffer(data, 0, data.Length);
                args.Completed += args_Completed;
                client.Client.SendAsync(args);
            }
        }
 
        void args_Completed(object sender, SocketAsyncEventArgs e)
        {
            textBox1.Invoke(new Action(() =>
            {
                textBox1.Clear();
                textBox1.ReadOnly = false;
            }));
        }
По "3 строчки", да, на одном компьютере проверено, но сам факт, никаких задержек не наблюдаю...
0
Кодогенератор
200 / 200 / 51
Регистрация: 15.06.2011
Сообщений: 794
23.05.2014, 10:45 10
Цитата Сообщение от Spawn Посмотреть сообщение
на одном компьютере проверено, но сам факт, никаких задержек не наблюдаю..
может из-за того что компьютер компьютеру рознь?
0
995 / 893 / 354
Регистрация: 24.03.2014
Сообщений: 2,381
Записей в блоге: 2
23.05.2014, 10:54 11
hepper, и это тоже, но пока исхожу из обсуждаемой темы Если автору кажется, что проблема в методах/компиляторе/расположении Луны, то будем искать проблему именно в этом, а там уж как пойдёт
0
192 / 199 / 82
Регистрация: 11.04.2013
Сообщений: 1,086
23.05.2014, 13:43  [ТС] 12
Spawn, Характеристики компа на котором ты проверял?
0
995 / 893 / 354
Регистрация: 24.03.2014
Сообщений: 2,381
Записей в блоге: 2
23.05.2014, 13:51 13
Core 2 Duo E8400 3 GHz
8GB RAM
Windows 7 Professional

Проект на котором проверял (ну и основной код которого выше)
Вложения
Тип файла: rar ClientServer.rar (18.4 Кб, 2 просмотров)
0
192 / 199 / 82
Регистрация: 11.04.2013
Сообщений: 1,086
23.05.2014, 14:41  [ТС] 14
Celeron 1800 GHz 2GB RAM WinXP

Я даже затестить не смогу
0
995 / 893 / 354
Регистрация: 24.03.2014
Сообщений: 2,381
Записей в блоге: 2
23.05.2014, 14:49 15
Сейчас под 3.5 сделаю... или сразу 2.0?
0
192 / 199 / 82
Регистрация: 11.04.2013
Сообщений: 1,086
23.05.2014, 15:05  [ТС] 16
Spawn, Кто сказал что ХР уже свое отжила ?
0
995 / 893 / 354
Регистрация: 24.03.2014
Сообщений: 2,381
Записей в блоге: 2
23.05.2014, 15:14 17
Ну, на самом деле можно было и под 3.5 с async/await сделать, но не стал, по-старинке всё.
Проекты под 3.5.
Вложения
Тип файла: rar ClientServer35.rar (18.3 Кб, 4 просмотров)
0
192 / 199 / 82
Регистрация: 11.04.2013
Сообщений: 1,086
23.05.2014, 16:14  [ТС] 18
Цитата Сообщение от Spawn Посмотреть сообщение
и под 3.5 с async/await сделать
Просвети как?
0
Master of Orion
Эксперт .NET
6098 / 4954 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
23.05.2014, 17:15 19
EVG-1980, как откомпилировать JIT сразу это вопрос из разряда "как сделать холодный огонь и горячий лед". JIT подразумевает компиляцию в real-time. Шарп можно компилировать заранее, но смысла нет в этом. Лучше в фоне при загрузке методы прогони, и все.
0
995 / 893 / 354
Регистрация: 24.03.2014
Сообщений: 2,381
Записей в блоге: 2
23.05.2014, 18:27 20
Цитата Сообщение от EVG-1980 Посмотреть сообщение
Просвети как?
async/await - паттерн, который используется с Task (System.Threading.dll), но вся магия заложена в компилятор, а не в библиотеки .NET определённой версии. В идеале нужна VS 2012, которая поддерживает ключевые слова async/await, но если извернуться, то на 2010 встаёт Async CTP, который морально устарел уже года 3 как, но всё же способен компилировать работоспособный код. Также требуется AsyncBridge, так как Microsoft официально сделал поддержку только для .NET 4

Добавлено через 1 минуту
Всё названное довольно активно использовалось и в коммерческом продукте (который и сейчас работает в довольно крупной структуре) не смотря на свою версию 0.2
2
23.05.2014, 18:27
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
23.05.2014, 18:27
Помогаю со студенческими работами здесь

Как заставить Яндекс стереть инфу о сайте (весь кеш)
Добрый вечер. Сайт находится в бане уже почти полгода. Всё бы ничего, забыл бы про него, но......

Как заставить приложение сканировать весь компьютер вместо файла?
List<string> search = Directory.GetFiles(@"C:\").ToList(); foreach (string items...

Как заставить страницу открываться в Word-е сразу?
Ситуация: По запросу формируется ASP страничка. Необходимо, чтобы у клиента она открылась в...

Как прочитать текстовый файл не весь сразу, а только вторую строку
здравствуйте! Как прочитать текстовый файл не весь сразу, а только вторую строку (где год рождения...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru