Что может заставить программу работать намного быстрее во второй раз?

При тестировании кода, который я пишу, я заметил, что длительные операции, как правило, выполняются намного при первом запуске программы дольше, чем при последующих запусках, иногда в несколько раз больше. 10 и более. Очевидно, здесь есть какая-то проблема с холодным / теплым кешем, но я не могу понять, что это такое.

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

Кроме того, это не кеш диска. Я исключил это, загрузив все данные с диска заранее и обработав их впоследствии, и это фактическая обработка данных с привязкой к ЦП происходит медленно.

Так что же может привести к тому, что моя программа будет работать медленно при первом запуске, но затем, если я закрою ее и снова запущу, она будет работать значительно быстрее? Я видел это в нескольких разных программах, которые делают разные вещи, так что, похоже, это общая проблема.

РЕДАКТИРОВАТЬ: Для пояснения я пишу на Delphi, хотя я не думаю, что это проблема, связанная с Delphi. Но это означает, что какой бы ни была проблема, она не связана с проблемами JIT, сборкой мусора или любым другим багажом, который несет с собой управляемый код. И я не занимаюсь сетевыми подключениями. Это чистая обработка, привязанная к ЦП.

Один пример: компилятор сценария. Он работает следующим образом:

  • Загрузить весь файл в память с диска
  • Лексировать весь файл в очередь токенов
  • Анализировать очередь в дерево
  • Запустить генерацию кода на дереве для создания байт-кода

Если я скармливаю ему огромный файл сценария (~ 100 тыс. Строк) после загрузки всего этого с диска в память, шаг lex займет около 15 секунд при первом запуске и 2 секунды при последующих запусках. (И да, я знаю, что это еще долго. Я над этим работаю ...) Я хотел бы знать, откуда это замедление и что я могу с этим поделать.

29
задан Peter 26 September 2011 в 21:38
поделиться