Недавно, мой босс попросил, чтобы я улучшил скорость запуска нашего приложения, AP было записано с C++. AP является немного крупным, оно использовало 200 + dll, для Windows нужно долгое время для ввода основного () функция. Я попробовал эти два пути, но все еще не могу сделать нашего босса счастливым.
Там другие пути состоят в том, чтобы улучшить его?Заранее спасибо.
Чтобы определить истинную причину замедления, необходимо составить профиль вашего приложения. Например, может оказаться, что Вы проводите большую часть времени в какой-то рутине инициализации одной из загружаемых Вами .dll. Найдите хороший инструмент профилирования, а затем определите, где находится узкое место.
Jeez! Уменьшите этот счет DLL!
Конечно, если вы собираетесь загрузить 200 DLL в Startup, она принесет кучи неисправностей жестких страниц и принять навсегда загрузку (например, 3ds Max).
Переосмыслить свою стратегию DLL. Объедините много маленьких DLL в более крупные. Я серьезно сомневаюсь, что вам нужно 200+.
И смотрите, как Рэймонд Чен пять вещей, которые каждый программист Win32 должен знать .
Пара вещей, которые, наверное, вам нужно знать:
Уменьшение количества DLL является обязательным в этой ситуации. Может быть, тогда вы сможете комбинировать, но я думаю, что это модульная конструкция, что означает, что в большинстве случаев, они не могут быть комбинированы.
Можно также загружать библиотеки DLL при использовании, а не при открытии программы, и загружать только необходимые библиотеки DLL, чтобы загрузить программу при запуске.
Или можно даже задержать загрузку DLL, сначала запустив программу с нужными DLL, а затем загрузив остальные в порядке важности использования.
Я предлагаю изменить свой код для обработки события RunWorkerCompleted
, чтобы получить уведомления, когда ваш FlanceWorker
завершен с их работой. Существует пример того, как использовать Backgroundworker
в в . Официальная документация .
Используйте ленивую конструкцию статических объектов.
Вместо того, чтобы иметь глобал, которые создаются во время запуска, подобно этому:
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.
При использовании 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 различных конечных автоматах.
Код будет в два раза более простым и в три раза более четким, если он будет написан структурно или последовательно. За исключением того, что это не сработает, или сработает с мерзким исполнением.
-121--3440527-Если у вас есть доступ к коду dlls (или некоторых из них), вы можете найти кандаты для статической ссылки. Если вы можете преобразовать их в статические библиотеки, вы можете значительно ускорить запуск.
Вы получаете хороший совет здесь. Наличие многих DLL является одним из тех, которые вы заплатите. Кроме того, инициализация их может делать намного больше, чем вам нужно.
Есть простой способ сказать, что нужно время. Запустите приложение под IDE, такую как Visual Studio, и пока он запускается, нажмите кнопку «Пауза» и отобразить стек вызова. Сделайте это несколько раз. Каждый раз, когда вы увидите, что это делает и, самое главное, почему . Если вы видите, что он проводит много времени, чтобы делать то, что вам действительно не нужно, то это говорит вам, что исправить.
Один вариант, и его игры в чистом разуме, состоит в том, чтобы обеспечить прогресс бар на нагрузке ...
Если у людей есть что посмотреть на это отвлекает их и делает его «чувствовать» быстрее, поэтому есть зеркала между Лифты, которые служат многочисленным этажам ...
Это не победит секундомер, хотя ...
Другая альтернатива - повторно написать его, чтобы использовать меньше DLL. Сколько из бюджета (денег / времени) у вас есть следующий вопрос