Что я заметил при тестировании кода, который я пишу, так это то, что длительные операции имеют тенденцию запускаться на намного дольше при первом запуске программы, чем при последующих, иногда в 10 и более раз,Очевидно, что здесь есть какая-то проблема холодного / теплого кэша, но я не могу понять, что это такое.
Это не кэш-память ЦП, так как эти длительные операции, как правило, представляют собой циклы, которые япередать много данных, и они должны быть полностью загружены после первой итерации.(Плюс, выгрузка и перезагрузка программы должны очистить кеш.)
Кроме того, это не дисковый кеш.Я исключил это, загрузив все данные с диска и обработав их впоследствии, и это фактическая обработка данных, связанная с процессором, которая идет медленно.
Так что может заставить мою программу работать медленно в первый раз?раз я запускаю его, но потом, если я закрою его и запустлю снова, он будет работать значительно быстрее?Я видел это в нескольких разных программах, которые делают совершенно разные вещи, так что, похоже, это общая проблема.
РЕДАКТИРОВАТЬ: Для пояснения, я пишу в Delphi, хотя я не думаю, что этоэто специфичная для Delphi проблемаНо это означает, что, какой бы ни была проблема, она не связана с проблемами JIT, проблемами со сборкой мусора или любым другим багажом, который сопровождает управляемый код.И я не имею дело с сетевыми подключениями.Это чисто процессорная обработка.
Один пример: компилятор скрипта.Он работает так:
- Загрузка всего файла в память с диска
- Lex весь файл в очередь токенов
- Анализ очереди в дереве
- Запустите codegen на дереве, чтобы получить байт-код
Если я загрузлю его огромный файл сценария (~ 100 тыс. Строк) после загрузки всей вещи с диска в память, шаг lex займет около15 секунд при первом запуске и 2 секунды при последующих запусках.(И да, я знаю, что это еще долго. Я работаю над этим ...) Я хотел бы знать, откуда происходит это замедление и что я могу с этим поделать.