Сравнение холодного старта и теплого старта - PullRequest
12 голосов
/ 24 сентября 2008

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

Большая часть (если не все), по-видимому, заключается в загрузке DLL, когда библиотеки DLL находятся на страницах кэшированной памяти, они загружаются намного быстрее. Мы попытались использовать ClearMem для имитации перезагрузки (так как она намного менее трудоемка, чем фактическая перезагрузка) и получили смешанные результаты, на некоторых машинах казалось, что перезагрузка имитируется очень последовательно, а на некоторых нет.

Подводя итог моим вопросам:

  1. Испытывали ли вы разницу во времени запуска между холодным и теплым запусками?
  2. Как вы справились с такими различиями?
  3. Вы знаете способ надежной симуляции перезагрузки?

Edit:

Пояснения к комментариям:

  • Приложение в основном является родным C ++ с некоторым .NET (первая загруженная сборка .NET платит за CLR).
  • Мы стремимся улучшить время загрузки, очевидно, мы выполнили свою часть профилирования и улучшили точки доступа в нашем коде.

Что-то, что я забыл упомянуть, это то, что мы добились некоторого улучшения, пере-основав все наши двоичные файлы, чтобы загрузчик не делал это во время загрузки.

Ответы [ 10 ]

6 голосов
/ 24 сентября 2008

Что касается симуляции перезагрузок, задумывались ли вы о запуске приложения с виртуального ПК ? Используя виртуализацию, вы можете снова и снова воспроизводить набор условий снова и снова.

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

4 голосов
/ 24 сентября 2008

Было бы трудно по-настоящему симулировать перезагрузку программного обеспечения. При перезагрузке все устройства на вашем компьютере получают установленный бит сброса, что должно привести к потере всей памяти системы.

На современном компьютере у вас есть память и кеширование везде: есть подсистема ВМ, которая хранит страницы памяти для программы, затем у вас есть ОС, кэширующая содержимое файлов в памяти, затем дисковый буфер секторов на самом жестком диске. Возможно, вы можете сбросить кэш ОС, но буфер на диске на диске? Я не знаю пути.

3 голосов
/ 24 сентября 2008

Как вы профилировали свой код? Не все методы профилирования одинаковы, и некоторые находят горячие точки лучше, чем другие. Вы загружаете много файлов? Если это так, в игру может вступить фрагментация диска и время поиска.

Возможно, даже вставив в код основную информацию о времени, записав ее в файл журнала и изучив файлы при холодном / горячем запуске, вы сможете определить , где приложение тратит время.

Без дополнительной информации я бы склонялся к файловой системе / дисковому кешу как вероятной разнице между этими двумя средами. Если это так, то вам нужно либо тратить меньше времени на загрузку файлов заранее, либо найти более быстрые способы загрузки файлов.

Пример: если вы загружаете много файлов двоичных данных, ускорьте загрузку, объединив их в один файл, а затем выполните проверку всего файла в памяти за одно чтение и проанализируйте их содержимое. Меньше диска ищет и время тратит на чтение с диска. Опять же, может быть, это не относится.

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

2 голосов
/ 18 декабря 2008

Очень эффективный метод для сокращения времени холодного запуска приложения - это оптимизация порядка ссылок на функции.

Компоновщик Visual Studio позволяет передавать в файл списки всех функций в модуле, с которым выполняется связь (или только некоторые из них - это не обязательно все), и компоновщик помещает эти функции рядом друг друга в памяти.

Когда ваше приложение запускается, обычно в вашем приложении вызываются функции init. Многие из этих вызовов относятся к странице, которой еще нет в памяти, что приводит к сбою страницы и поиску диска. Отсюда и медленный запуск.

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

Ознакомьтесь с оптимизацией профиля в Visual Studio 2005 или более поздней версии. PGO делает для вас упорядочение функциональных ссылок.

Немного сложно работать в процессе сборки, потому что с PGO вам нужно связать, запустить ваше приложение, а затем повторно связать с выводом из запуска профиля. Это означает, что ваш процесс сборки должен иметь среду выполнения и выполнять очистку после плохих сборок и всего такого, но выигрыш, как правило, в 10 или более раз быстрее холодного запуска без изменений кода.

Здесь есть еще немного информации о PGO:

http://msdn.microsoft.com/en-us/library/e7k32f4k.aspx

2 голосов
/ 25 сентября 2008

Один из успешных способов ускорить запуск приложения - переключить библиотеки DLL в режим отложенной загрузки. Это недорогое изменение (некоторое изменение настроек проекта), но оно может значительно ускорить запуск. После этого запустите зависящий от времени файл.exe в режиме профилирования, чтобы выяснить, какие библиотеки DLL загружаются при запуске, и отменить загрузку с задержкой. Помните, что вы также можете задержать загрузку большинства необходимых вам библиотек Windows.

2 голосов
/ 25 сентября 2008

@ Мортен Кристиансен сказал:

Например, один из способов ускорить запуск холодного запуска приложений (например). Adobe Reader, загружая некоторые файлы при запуске, тем самым скрывая холодный старт от пользователей. Это возможно только в том случае, если программа не должна запускаться немедленно.

Это заставляет клиента платить за инициализацию нашего приложения при каждой загрузке, даже если оно не используется, мне действительно не нравится этот вариант (как и Raymond ).

1 голос
/ 17 марта 2009

В качестве альтернативы списку порядка функций, просто сгруппируйте код, который будет вызываться в тех же разделах:

#pragma code_seg(".startUp")
 //...
#pragma code_seg

#pragma data_seg(".startUp")
 //...
#pragma data_seg

Он должен легко поддерживаться при изменении кода, но имеет то же преимущество, что и список порядка функций.

Я не уверен, может ли список порядка функций также указывать глобальные переменные, но использование этого параметра #pragma data_seg будет просто работать.

0 голосов
/ 18 марта 2009

Если ваше приложение не очень сложное, вы можете просто скопировать все исполняемые файлы в другой каталог, это должно быть похоже на перезагрузку. (Кажется, что Cut and Paste не работают, Windows достаточно умна, чтобы знать, что файлы, перемещенные в другую папку, кэшируются в памяти)

0 голосов
/ 24 сентября 2008

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

0 голосов
/ 24 сентября 2008

Например, один из способов ускорить запуск холодного запуска приложений (например). Adobe Reader, загружая некоторые файлы при запуске, тем самым скрывая холодный старт от пользователей. Это возможно только в том случае, если программа не должна запускаться немедленно.

Еще одно замечание: у .NET 3.5SP1 предположительно значительно улучшена скорость холодного запуска, хотя насколько я не могу сказать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...