JIT-компилятор по сравнению с офлайновыми компиляторами

Вызов read() читает весь файл и оставляет курсор чтения в конце файла (ничего больше не читать). Если вы хотите прочитать определенное количество строк за раз, вы можете использовать readline(), readlines() или перебирать строки с помощью for line in handle:.

Чтобы ответить на ваш вопрос напрямую, был прочитан, с read() вы можете использовать seek(0), чтобы вернуть курсор чтения к началу файла (docs здесь ). Если вы знаете, что файл не будет слишком большим, вы также можете сохранить вывод read() в переменной, используя его в выражениях поиска.

Ps. Не забудьте закрыть файл после его завершения;)

37
задан Scott Wisniewski 27 February 2009 в 06:18
поделиться

6 ответов

Да, конечно, существуют такие сценарии.

  • JIT-компиляция может использовать профилирование времени выполнения для оптимизации конкретных случаев на основе измерения характеристик того, что код на самом деле делает в данный момент и может перекомпилировать "горячий" код по мере необходимости. Это не теоретически; HotSpot Java на самом деле делает это.
  • Дрожания могут оптимизировать для определенного ЦП и конфигурации памяти, используемой на фактических аппаратных средствах, где программа, оказывается, выполняется. Например, много приложений.NET будут работать или в 32-битном или в 64-битном коде, в зависимости от того, где они - JITted. На аппаратных средствах на 64 бита они будут использовать больше регистров, памяти и лучшую систему команд.
  • Виртуальные вызовы метода в жестком цикле могут быть заменены статическими вызовами на основе знания во время выполнения типа ссылки.

я думаю, что в будущем будут прорывы. В частности, я думаю, что комбинация JIT-компиляции и динамического контроля типов будет значительно улучшена. Мы уже видим это в пространстве JavaScript с V8 Chrome и TraceMonkey. Я ожидаю видеть другие улучшения подобной величины в не слишком отдаленном будущем. Это важно, потому что даже так называемые языки "со статическим контролем типов" имеют тенденцию иметь много динамических функций.

52
ответ дан Craig Stuntz 10 October 2019 в 08:50
поделиться

Да, JIT-компиляторы могут произвести более быстрый Машинный код, оптимизированный для текущей среды. Но практически программы VM медленнее, чем Собственные программы, потому что сам JITing использует время (больше Оптимизации == больше времени), и для многих методов JITing их может использовать больше времени, чем выполнение их. И вот почему GAC представлен в.NET

, побочный эффект А для JITing является потреблением памяти большой емкости. Однако это не связано со скоростью вычисления, она может замедлить целое выполнение программы, потому что потребление памяти большой емкости увеличивает вероятность, что Ваш код будет разбит на страницы к внешней памяти.

Извиняют меня за мой плохой английский язык.

12
ответ дан Bahaa Zaid 10 October 2019 в 08:50
поделиться

JIT имеет преимущества, но я не вижу, что он занимает полностью. Стандартные компиляторы могут провести больше времени, оптимизируя, в то время как JIT должен установить равновесие между слишком большой оптимизацией (занимающий больше времени, чем сохраняется оптимизацией), и слишком мало (занимающий слишком много времени в прямом выполнении).

очевидный ответ должен использовать каждого, где это выше. МОНЕТЫ В ПЯТЬ ЦЕНТОВ могут использовать в своих интересах время выполнения, представляющее более легко, чем стандартные оптимизаторы (хотя существуют компиляторы, которые могут взять профили во время выполнения в качестве входа для руководства оптимизации), и может обычно позволять себе сделать более определенную для ЦП оптимизацию (снова, много стандартных компиляторов делает это, но если Вы ожидаете выполнять исполняемый файл в различных системах, они не могут в полной мере воспользоваться им). Стандартные компиляторы могут провести больше времени и сделать это по-разному.

Поэтому система языка будущего будет иметь хорошие оптимизирующие компиляторы, которые испустят исполняемый код, разработанный для использования хорошими JIT-компиляторами оптимизации. (Это также, для многих людей, системы языка подарка.) (Система языка будущего будет также поддерживать все от современного Python/VB, пишущего сценарий к самому ужасному высокоскоростному перемалыванию чисел.)

Как со многими вещами, это предвещалось Lisp. Некоторое время назад, некоторые системы Lisp (не может действительно сказать многие, не было всего этого много реализаций языка Common LISP), интерпретировал функции Lisp путем компиляции их на лету. S-выражения Lisp (в чем написан код) являются довольно простыми описаниями деревьев синтаксического анализа, таким образом, компиляция могла пойти довольно быстро. Тем временем, оптимизация, компилятор Lisp мог уплотнить код, где производительность была действительно важна заранее.

7
ответ дан David Thornley 10 October 2019 в 08:50
поделиться

В основном, JIT-компиляторы имеет шанс на самом деле представить приложение, запущенное и сделать некоторый вывод подсказок на основе той информации. "офлайновые" компиляторы не смогут определить, как часто ответвление переходит и как часто оно проваливается, не вводя специальный код, попросите, чтобы dev запустил программу, проверил его в деле и перекомпилировал.

, Почему это имеет значение?

//code before
if(errorCondition)
{
  //error handling
}
//code after

преобразовывается во что-то как:

//code before
Branch if not error to Code After
//error handling
Code After:
//Code After

И x86 процессоры не предсказал бы условный переход вперед в отсутствие информации от единицы предсказания ветвлений. Это означает, что предсказывает код обработки ошибок для выполнения, и процессор, оказывающийся перед необходимостью сброс конвейер, когда это выясняет, что состояние ошибки не произошло.

JIT-компилятор А видел, что, и вставляют подсказку для ответвления, так, чтобы ЦП предсказал бы в корректном направлении. Предоставленные, офлайновые компиляторы могут структурировать код способом, который избежал бы mispredict, но если когда-нибудь необходимо смотреть на блок, Вам не мог бы понравиться он переходящий вокруг везде....

1
ответ дан Calyth 10 October 2019 в 08:50
поделиться

JIT-компиляторы имеют больше данных, которые они могут использовать для влияния на оптимизацию. Конечно, кто-то на самом деле должен написать код для использования тех данных, таким образом, это не простое как это.

0
ответ дан MSN 10 October 2019 в 08:50
поделиться

Еще одна вещь, которая была упущена в этом разговоре, - это то, что когда вы JIT выполняете фрагмент кода, его можно скомпилировать в свободное место в памяти. В таком языке, как C ++, если библиотека DLL построена так, что эта часть памяти недоступна, ей придется пройти через дорогостоящий процесс перебазирования. Быстрее превратить JIT-код в неиспользуемый адрес, чем перекомпилировать скомпилированную DLL в свободное пространство памяти. Что еще хуже, перебазированная DLL больше не может использоваться совместно. (см. http://msdn.microsoft.com/en-us/magazine/cc163610.aspx )

Я не очень впечатлен некоторыми оптимизациями в коде JIT C # 3.5. Простые вещи вроде битового тидлинга, необходимого для сжатия, ужасно неэффективны (он отказывался кэшировать значения в регистре ЦП и вместо этого переходил в память для каждой операции). Я не Я не знаю, почему он это делает, но это имеет огромное значение, и я ничего не могу с этим поделать.

Лично я думаю, что хорошим решением будет уровень оптимизации (1-100), который вы могли бы установить, чтобы сообщить JIT-компилятору сколько времени, по вашему мнению, следует потратить на оптимизацию вашего кода. Единственным другим решением может быть компилятор AOT (Ahead of Time), и тогда вы потеряете многие преимущества JIT-кода.

1
ответ дан 27 November 2019 в 04:32
поделиться
Другие вопросы по тегам:

Похожие вопросы: