способы улучшить скорость запуска приложения C++

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

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

Там другие пути состоят в том, чтобы улучшить его?Заранее спасибо.

5
задан Clare Macrae 28 July 2014 в 09:48
поделиться

7 ответов

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

5
ответ дан 18 December 2019 в 11:56
поделиться

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

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

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

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

5
ответ дан 18 December 2019 в 11:56
поделиться

Пара вещей, которые, наверное, вам нужно знать:

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

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

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

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

2
ответ дан 18 December 2019 в 11:56
поделиться

Я предлагаю изменить свой код для обработки события RunWorkerCompleted , чтобы получить уведомления, когда ваш FlanceWorker завершен с их работой. Существует пример того, как использовать Backgroundworker в в . Официальная документация .

-121--3525854-

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

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

Foo foo;
Bar bar;

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

, они построили на спрос со следующей IDIOM:

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()
}

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

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

1
ответ дан 18 December 2019 в 11:56
поделиться

При использовании C # наилучшей средой разработки является Visual Studio. Это не единственный вариант, так как MonoDeveloper и ExherleDeveloper являются двумя другими IDE, которые сами написаны на C # и имеют интегрированные средства сборки и отладки.

С точки зрения того, какую технологию использовать для построения веб-сайта, можно использовать ASP.NET , но я думаю, что для кого-то с опытом PHP ASP MVC будет более естественным.

Приложение браузера WPF потребует достаточно большого объема знаний (WPF, XAML и т.д.) и будет представлять собой предложение только IE.

-121--4460248-

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

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

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

Я должен прочитать сенсорный экран. Чтобы прочитать позицию, я должен обменяться примерно 15 командами через SPI. Мне нужны хорошие 100 показаний в секунду. Я должен подождать около 1 микросекунды после каждой команды, чтобы соответствующий флаг занятости исчез, прежде чем я смогу продолжить. Существует также ряд других операций, которые должны быть достижимы через один и тот же интерфейс, таких как установка контраста, изменение режимов, включение или выключение подсветки, считывание температуры. Если бы я выполнил в то время как (BUSY_BIT); за каждое ожидание, я бы съел все ЦП в считанные моменты. Если бы я сделал sched _ yield () или usleep (1) , я бы никогда не достиг нужного количества считываний. Единственный способ - конечный конечный автомат.

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

В моей работе до сих пор доминировали 2 системы, основанные на 3 различных конечных автоматах.

  1. большой веб-портал, где на каждом шаге вы извлекаете некоторые данные из базы данных и на его основе подготавливаете больше запросов. На последнем шаге данные используются для создания HTML. Каждая задача - модуль веб-страницы - была реализована как класс PHP, наследующий от движка. Состояние сохранилось в переменных класса. Каждый шаг был отдельной функцией. В конце шага сохраненные запросы были оптимизированы и отправлены в ядро через кэши, а ответы были предоставлены обратно в оригинал.
  2. встроенное устройство с множеством подсистем. Используется насос задачи. Каждый модуль регистрирует обработчик, который вызывается много раз в секунду из основного цикла. Обработчик может сохранять состояние в статических переменных или переменных класса с состояниями. Эта совместная многозадачность обеспечивает гораздо меньший объем памяти, чем выполнение всех задач в отдельных потоках, позволяет вручную устанавливать приоритеты задач путем их двойной регистрации, а также имеет высокий приоритет выполнения потоков, что затмевает остальную часть системы.
  3. полу-переводчик. Этот сенсорный экран. Вызовы функций и их состояния ожидания регистрируются, но каждый вызывается только один раз, затем удаляется из очереди программы. Интерпретатор вызывается как задача команды taskpump, выполняющей ограниченное количество функций до тех пор, пока не встретится функция, помеченная как состояние ожидания (или превышающая количество функций, подлежащих вызову). Затем она продолжается до тех пор, пока состояние ожидания не исчезнет. Другие задачи ставят задания в очередь как (иногда длинные) последовательности выполняемых функций, затем ждут результата. Таким образом, я могу ограничить число состояний, которые мне нужно создать, примерно 4, где мне нужны результаты. Если команда имеет значение «send away, never check result», как «set contrast», они вообще не нуждаются в дискретных состояниях. Таким образом, фактическими состояниями являются «ожидание события и регистрация запрошенных данных», «ожидание измерения» и «считывание результатов и их правильное назначение».

Код будет в два раза более простым и в три раза более четким, если он будет написан структурно или последовательно. За исключением того, что это не сработает, или сработает с мерзким исполнением.

-121--3440527-

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

1
ответ дан 18 December 2019 в 11:56
поделиться

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

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

1
ответ дан 18 December 2019 в 11:56
поделиться

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

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

Это не победит секундомер, хотя ...

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

0
ответ дан 18 December 2019 в 11:56
поделиться
Другие вопросы по тегам:

Похожие вопросы: