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