способы улучшить скорость запуска приложения C ++ - PullRequest
5 голосов
/ 02 февраля 2010

Недавно мой начальник попросил меня улучшить скорость запуска нашего приложения, точка доступа была написана на C ++. AP немного большая, она использовала 200+ dll, Windows требуется много времени для входа в функцию main (). Я попробовал эти два способа, но все еще не могу сделать нашего босса счастливым.

  1. задержка загрузки dll http://msdn.microsoft.com/en-us/library/yx9zd12s(VS.80).aspx
  2. используйте EDITBIN для изменения EXE http://msdn.microsoft.com/en-us/library/xd3shwhf(VS.80).aspx

Есть ли другие способы улучшить его? Заранее спасибо.

Ответы [ 7 ]

5 голосов
/ 02 февраля 2010

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

5 голосов
/ 02 февраля 2010

Jeez! Уменьшите это количество DLL!

Конечно, если вы собираетесь загрузить 200 DLL при запуске, это повлечет за собой кучу жестких сбоев страниц и будет длиться вечно (как 3ds max).

Переосмыслите свою стратегию DLL. Объедините много маленьких DLL в большие. Я серьезно сомневаюсь, что вам нужно 200+.

И наблюдайте за «Пятью вещами» Рэймонда Чена, которые должен знать каждый программист Win32 .

2 голосов
/ 02 февраля 2010

Я думаю, вам нужно знать пару вещей:

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

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

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

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

1 голос
/ 02 февраля 2010

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

Есть простой способ узнать, что занимает время. Запустите приложение в среде IDE, например Visual Studio, и во время его запуска нажмите кнопку «Пауза» и отобразите стек вызовов. Сделайте это несколько раз. Каждый раз вы будете видеть, что он делает, и, самое главное, почему . Если вы видите, что тратите много времени на то, что вам действительно не нужно, то это говорит вам, что нужно исправить.

1 голос
/ 02 февраля 2010

Используйте ленивую конструкцию из статических объектов.

Вместо того, чтобы создавать глобальные переменные, которые создаются при запуске, вот так:

Foo foo;
Bar bar;

int main()
{
    // Access foo and bar
}

Сконструируйте их по требованию со следующей идиомой:

Foo & foo()
{
    static Foo the_instance;
    return the_instance;
}
Bar & bar()
{
    static Bar the_instance;
    return the_instance;
}

int main()
{
    // Access objects through foo() and bar()
}

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

Это не поможет при загрузке этих DLL.

1 голос
/ 02 февраля 2010

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

0 голосов
/ 02 февраля 2010

Одним из вариантов, и его чисто интеллектуальными играми, является предоставление индикатора выполнения при загрузке ...

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

Это не побьет секундомер ...

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

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