Подтвердить что ты не робот

Сравнение холодного старта с теплым стартом

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

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

Подводя итоги, следующие вопросы:

  • Испытывали ли вы различия в времени запуска между холодным и теплым пусками?
  • Как вы делитесь такими различиями?
  • Знаете ли вы, как легко смоделировать перезагрузку?

Edit:

Разъяснения для комментариев:

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

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

4b9b3361

Ответ 1

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

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

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

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

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

Ответ 2

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

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

Ответ 3

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

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

Ответ 4

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

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

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

Ответ 5

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

Ответ 6

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

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

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

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

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

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

Здесь есть дополнительная информация о PGO:

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

Ответ 7

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

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

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

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

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

Ответ 8

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

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

Ответ 9

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

Ответ 10

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