Оптимизация холодного запуска - PullRequest
6 голосов
/ 28 сентября 2010

Я пытался искать, но пока безуспешно. Кто-нибудь знает хороший ресурс, как следует проводить оптимизацию при холодном запуске?

Рассматриваемое приложение - приложение C ++ / MFC, скомпилированное с VS2010, полная версия со встроенным профилировщиком. Я попытался сократить весь лишний вес, чтобы время загрузки было приемлемым для теплого старта, но холодный старт просто недопустим. Иногда это близко к 30 секундам, и нет ничего, что было бы медленным кодом. Загрузка процессора достигает 80% при теплых запусках и остается ниже 20% при холодных запусках.

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

Ответы [ 4 ]

2 голосов
/ 28 сентября 2010

Длительное время холодного запуска - это чисто проблемы с жестким диском. Поиск DLL, которые нужны вашей программе. Вы не можете оптимизировать жесткий диск без использования инструмента дефрагментации. Сегментирование вашей программы так, что загрузка DLL перекрывает время пользовательского интерфейса, довольно сложно. Использование COM-серверов или опция компоновщика / DELAYLOAD являются очевидными подходами, но не так просто вывести функциональный интерфейс на экран, не касаясь чего-либо. Разделение классов на библиотеки DLL, которые запускаются с помощью панели инструментов или пунктов меню, конечно, возможно, но MFC не делает это простым с обновлением пользовательского интерфейса простоя (извините, забыл точную фразу).

Вы не одиноки, хорошими примерами программ, которые тоже сталкиваются с этой проблемой, являются Microsoft Office и Acrobat Reader. Они решают проблему очень неприлично, они устанавливают «оптимизатор» в ключе «Выполнить реестр» или ярлыке папки «Автозагрузка». Который ничего не делает, но касается всех библиотек DLL, чтобы они загружались в кэш файловой системы. Горячий старт EXE-файла после того, как пользователь проверил ее электронную почту. Я ненавижу их и продолжаю удалять их после того, как они вернули его обратно. Но это улучшает мнение пользователей, они думают, что это медленная программа чтения электронной почты. Или, конечно же, взорванная Windows-must-got-a-Mac.

Тем не менее, 30 секунд это чертовски долгое время. Удостоверьтесь, что это не проблема только на вашем компьютере разработчика, вызванная сборкой двоичных файлов снова и снова и распределением их по всему диску. Запустите Defraggler. Затем проверьте, что все это делает с помощью утилиты SysInternals ProcMon.

1 голос
/ 28 сентября 2010

"Я пытался поиграть с настройками компоновщика с задержкой загрузки, но я не совсем понимаю, как они влияют на производительность."

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

Компоновщик эффективно использует заглушку для LoadLibrary и GetProcAddress . Как только DLL загружена, заглушка перезаписывается, и с этого момента вызовы выполняются непосредственно в DLL.

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

1 голос
/ 28 сентября 2010

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

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

Пробовали ли вы такой инструмент, как Procmon (www.sysinternals.com), чтобы увидеть, какие файлы касаются?

0 голосов
/ 28 сентября 2010

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

Профилировщик лучше, чем ничего, но вам нужно выяснить, что на самом деле происходит .

Вот способ сделать это.

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

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