Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Кэширование машинного кода  (Прочитано 7124 раз)
0 Пользователей и 1 Гость смотрят эту тему.
docm
Новенький

ua
Offline Offline

« : 11-08-2010 08:26 » 

Доброго времени суток! Когда пользователь запрашивает страницу и идет выполнение кода, то jit компилятор генерирует машинный код и кэширует его в папке Temporary ASP.NET Files. Так вот вопрос, этот машинный код сохраняется для всех последующих пользователей или существует только для текущего и будет удален, после его выхода? Заранее спасибо.
Записан
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #1 : 11-08-2010 08:57 » 

Какой тогда смысл кешировать, если можно использовать только один раз?
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #2 : 11-08-2010 09:06 » 

docm, если приложение написано с разделением aspx-разметки и кода на языке программирования, то компилятор вообще не запускается - это ускоряет запуск страниц и не раскрывает исходный код для хостера. До развёртывания приложения все файлы с исходным кодом компилируются в одну сборку (dll-файл) и помещаются в папке bin приложения.

JIT-компилятор в .NET делает не то, что ты говоришь. Он является элеметом среды выполнения CLR и в процессе выполнения программы компилирует её куски из байт-кода языка IL в машинный код целевой платформы. Происходит это всегда - при запуске любого exe или dll (если exe не собран сразу в машинном коде), и это не кэшируется. Результат работы JIT-компилятора существует только в оперативной памяти - до момента выгрузки приложения. В твоём случае приложение выгружается вместе с удалением сессии самого последнего пользователя, когда больше не осталось активных пользователей. Одно приложение (скомпилированное и выполняющееся) осблуживает всех подключающихся к нему пользователей.

Ты же говоришь о том случае, когда код на языке программирования (VB, C#, F# и т.п.) записан прямо в aspx-файле, и поэтому для его выполнения в начале запускается компилятор (обычный), который компилирует исходный код языка программирования в байт-код языка IL. Именно этот этап кэшируется, потому что достаточно ресурсоёмкий по своей природе. Кэш сохраняется всё время существования приложения в IIS, если в aspx не вносятся изменения. Аналогичен кэшу dll в Windows. Если же aspx изменилась, то происходит перекомпиляция страницы, и кэш обновляется. Существование этого кэша не зависит от активности приложения, и к JIT-компилятору отношения не имеет.
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #3 : 11-08-2010 11:46 » new

docm, зачем приватом писать?

Цитата: docm
Спасибо за ответ!
Вы написали, что машинный код, скомпилированный jit компилятором находится в оперативной памяти и не кеширутеся. Не могли бы вы обьяснить тогда, что имел ввиду автор Мэтью Мак-Дональд, написав:

"Разумеется, JIT-компиляция не была бы такой полезной, если бы ее нужно было
выполнять при каждом запросе пользователем какой-нибудь страницы с Web-сайта.
К счастью, приложения ASP.NET не требуют, чтобы компиляция выполнялась при каж-
дом запросе Web-страницы. Вместо этого код IL в них создается один раз и генерирует-
ся заново только в случае изменения исходного кода, а файлы собственного машинного
кода кэшируются в системном каталоге, путь к которому выглядит примерно так:
c:WindowsMicrosoft.NETFrameworkv2.0.50727Temporary ASP.NET Files"
Вот он это и имел ввиду: что компиляция из языка программирования в IL происходит только один раз - после обновления исходного кода при запросе обновлённой страницы. Как я выше и сказал.

Что тут подразумевается под "машинным кодом" - вопрос скорее всего к переводчику. JIT (just in time) как раз и предполагает, что компиляция выполняется "на лету", что даёт ускорение работы по сравнению с интерпретацией байт-кода, а хранится (долговременно, например в кэше) байт-код - как независимый от платформы формат инструкций, но не машинный код. В противном случае JIT теряет смысл - достаточно обычной компиляции.

Однако в .NET есть инструменты, позволяющие выполнить компиляцию байт-кода в машинный код целевой платформы.

Так что либо JIT-компиляция байт-кода без кэширования машинного кода, либо компиляция с кэшированием машинного кода, но без JIT. Единственный способ увязать JIT и кэш именно тот, о котором я сказал в самом начале: нужно различать два этапа компиляции. Либо же в тексте книги допущена ошибка или неточность перевода.
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines