Как увеличить скорость запуска приложения Delphi?

Что вы делаете, чтобы увеличить скорость запуска (или уменьшить время запуска) вашего приложения Delphi?

Кроме конкретного приложения, есть ли стандартная уловка, которая всегда работает?

Note: I'm not talking about fast algorithms or the likes. Only the performance increase at startup, in terms of speed.

Ответы на вопрос(11)

ых, соединение с сервером приложений и т. Д.), Которые должны выполняться при запуске в потоке. Любая функциональность, которая зависит от этих задач, отключена до завершения потока.

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

Покажите заставку, чтобы люди не заметили долгого запуска :).

 18 июл. 2009 г., 00:18
И это действует как форма брендинга продукта.
 17 мар. 2012 г., 15:51
Каждое сообщение в блоге Криса Хесика сейчас недоступно ... :( По крайней мере, мы можем использовать Archive.org еще ... Кто-то должен вернуться к этим темам в сообщениях блога.

В опциях проекта не создавайте автоматически все ваши формы заранее. Создайте и освободите их по мере необходимости.

 12 июл. 2009 г., 17:31
@ Uwe: ваш комментарий достаточно отчетлив, чтобы он был отдельным ответом. Я делаю это, за исключением того, что я выгляжу как представитель, и хотя я мог бы сделать свой ответ CW, но тогда вы не получите ответ.
 12 июл. 2009 г., 10:48
+1 - и позвольте мне добавить: откройте любое соединение, будь то база данных, интернет, COM или что-то еще, в то время, когда вам это нужно в первую очередь.
 12 июл. 2009 г., 18:14
@Argalatyr: спасибо за предложение

Самый быстрый код - это код, который никогда не запускается. Совершенно очевидно, правда;)

 13 нояб. 2009 г., 16:45
Очевидный ... правда. Но это не очень полезно.

Ну, как предложил Аргалатыр, я поменяю свой комментарий на отдельный ответ:

В качестве дополнения к «не создавать автоматически формы» Ответ (который будет весьма эффективен сам по себе) Я предлагаю отложить открытие соединений с базами данных, Интернетом, COM-серверами и любым периферийным устройством, пока оно вам не понадобится.

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

UPX использовался какпример о том, как загрузить FireFox быстрее.

Обратите внимание, что естьотрицательные стороны чтобы сжать сжатие.

Решение Вопроса

Попробуй сделатьas little as possible in your main form's OnCreate event, Скорееmove some initialization to a different method и сделайте это, как только форма показывается пользователю. Индикатор того, что приложение занято с занятым курсором мыши, имеет большое значение.

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

Помимо этого вы можете делать обычные вещи, какexclude debug information and enable optimization в компиляторе.

Более того,don't auto create all your forms, Создать ихdynamically как вам нужно.

 22 июл. 2009 г., 16:54
@utku Я понимаю, что вы не любите заставки, но они полезны, когда основная форма не отображается сразу. В противном случае ваш пользователь может не знать, что приложение запущено, и попытаться перезапустить его.
 28 окт. 2009 г., 18:12
R.E. Заставка, как насчет картинки основной формы - похоже, она быстро запустилась, даже если вы ничего не можете с ней сделать. Немного похоже на Vista, правда. ;-)
 12 июл. 2009 г., 18:28
Итак, что такое хорошее уведомление при запуске? Мне лично не нравятся заставки. Что еще это может быть в любом случае?
 17 июл. 2009 г., 13:14
Все, что находится в сообщении о состоянии, сообщающем пользователю, что вы делаете после основной формы, отображается на небольшом ярлыке где-то в основной форме. Индикатор выполнения также полезен, если это возможно, в качестве альтернативы вращающегося индикатора выполнения.

All 'initialization' blocks in all units are executed in "first seen" order. All auto-created forms are created (loaded from DFM files and their OnCreate handler is called) You main form is displayed (OnShow and OnActivate are called).

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

Также возможно, что одному из блоков инициализации требуется некоторое время для выполнения. Чтобы проверить, поместите точку останова в первую строку вашей программы (основной блок 'begin..end' в файле .dpr) и запустите программу. Весь блок инициализации будет выполнен, а затем точка останова остановит выполнение.

Аналогичным образом вы можете перейти (F8) к основной программе - вы увидите, сколько времени занимает создание каждой автоматически созданной формы.

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

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

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

Еще одна проблема, с которой я часто сталкиваюсь, - это метод, используемый для импорта и экспорта данных в файлы. Обычно в бизнес-приложениях Delphi я вижу функции экспорта, которые работают с DataSets - повторяются и записываются в файл. Рассмотрим метод, использованный для записи в файл, рассмотрим доступную память, учтите, что «папка» запись / чтение может быть локальной на машине или удаленным сервером.

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

First thing to do is to clear auto created forms list (look for Project Options). Create forms on the fly when needed, especially if the application uses database connection (datamodule) or forms that include heavy use of controls. Consider using form inheritance also to decrease exe size (resource usage is mimized) Decrease number of forms and merge similar or related functionality into single form
 18 дек. 2009 г., 11:42
Скажем, у вас есть приложение из двух таблиц. И у вас есть две разные формы, перечисляющие данные в основном. И у вас есть элементы управления, которые активируют операции CRUD с использованием других форм. Если вы используете некоторые шаблоны проектирования и удаляете «логику» Из этих форм вы бы не создавали формы для каждой таблицы. Но все же у вас есть смысл сказать, что мои первые и последние имеют какое-то противоречие. Надеюсь, это объяснение делает это немного ясным. (И говорить вам об этом не значит, что я всегда смогу реализовать это успешно :))
 13 нояб. 2009 г., 16:44
Использовать наследование для уменьшения размера EXE? Это звучит странно для меня ... возможно, вы можете объяснить, что вы имеете в виду. И если вы будете следовать своему первому пункту, ваш последний пункт, вероятно, не понадобится ...

Ваш ответ на вопрос