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

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Кэширование машинного кода  (Прочитано 3836 раз)
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 » 

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