2011-01-20 33 views
6

Tôi có một dpr với 290+ đơn vị.Dự án Delphi với nhiều đơn vị tốn nhiều thời gian để chạy

exe ​​được biên dịch là 50MB.

mã DPR tại là như thế này:

begin 
    ShowMessage('Before Initialize'); 
    Application.Initialize; 

Khi tôi nhấp đúp chuột vào exe xây dựng Tôi nhận thấy rằng 8 giây trôi qua trước khi tôi xem "Trước khi khởi". Đây có phải là do kích thước exe lớn không? Hay có cách nào để giảm thiểu thời gian này?

Trả lời

4

Dựa trên câu hỏi của bạn, nó có thể là bất cứ điều gì.

Lời khuyên duy nhất tôi có thể cung cấp cho bạn là đo lường:
Ghi lại dấu thời gian của mỗi mục nhập/thoát trong tất cả các phần khởi tạo đơn vị của bạn.

Dựa trên một trong những bình luận của bạn (mà bạn nên thêm vào câu hỏi của bạn vì nó mô tả chi tiết hơn):

WindowsCodecs.dll được khởi tạo bởi một trong những đơn vị của bạn, có thể là chuyển đổi một hoặc nhiều hình ảnh sang một định dạng khác.
Bạn nên trì hoãn chuyển đổi cho đến khi cần chuyển đổi.

--jeroen

+0

Làm cách nào để kiểm tra xem dòng mã nào khiến WindowsCodec.dll được gọi? – LaBracca

+1

Điều đó có thể khó khăn; những gì bạn có thể làm là trong cửa sổ Mô-đun Delphi, thiết lập một điểm ngắt trên tải của WindowsCodec.dll, sau đó xem ngăn xếp trong breakpoint. –

+5

Cuối cùng tôi đã tải xuống bản dùng thử AQTime Profiler và tôi đã tìm thấy sự cố trong mã khởi tạo thư viện của bên thứ ba. – LaBracca

17

Trước khi áp dụng.Kích hoạt mọi phần khởi tạo của mỗi đơn vị được thực hiện. Bạn có thể có một số mã trong đó cần có thời gian.

Số lượng đơn vị không phải là vấn đề. Tôi có một dự án với hơn 1100 đơn vị, exe là 35 MB và nó bắt đầu ngay lập tức.

Nếu bạn đang bắt đầu từ ổ đĩa mạng hoặc đĩa thực sự chậm, bạn có thể gặp sự cố chậm lại.

+4

Bạn có thể để chẩn đoán nơi chương trình đang dành thời gian của mình bằng cách dán một hồ sơ (ví dụ http://delphitools.info/samplingprofiler/) trên nó trong quá trình khởi động. –

+4

Cũng có thể do chương trình chống vi-rút gây ra. – gabr

+5

Mẹo nhanh: Như trên, các phần khởi tạo trong ứng dụng của bạn được thực hiện, nhưng cũng có, các phần khởi tạo cho các thành phần của bạn được thực hiện. Một chậm lớn tôi tìm thấy lúc khởi động (lên đến 60 giây chậm trễ) là do một máy in-thuộc tính-hộp thoại thành phần đó đã cố gắng để truy vấn tài sản của một máy in mạng mà tôi đã cài đặt trong bảng điều khiển, đó không phải là đáp ứng. Các ổ đĩa mạng được ánh xạ và các tài nguyên mạng khác không phản hồi và các khởi tạo thành phần có thể là một vấn đề. Sử dụng AQTime, đi kèm với RAD Studio XE, để cấu hình ứng dụng của bạn. –

1

Phần khởi tạo của các đơn vị thường không phải là vấn đề tốc độ (trừ khi bạn có một số nội dung liên quan đến cơ sở dữ liệu trong đó).

Điều gì có thể chậm là tải TForm từ tài nguyên.

Luôn luôn có TForm được tạo khi đang di chuyển, chỉ khi cần thiết: - Chuyển đến menu "Dự án", sau đó chọn "Tùy chọn", sau đó chọn tab "Biểu mẫu". - Đặt tất cả các biểu mẫu không bắt buộc từ danh sách bên trái sang danh sách "có sẵn" phù hợp. - Tạo biểu mẫu theo yêu cầu, bằng một số mã.

Các đơn vị vẫn giữ nguyên:

type 
    TOneForm = class(TForm) 
    .... 
    end; 

var 
    OneForm: TOneForm; 

Nhưng bạn có thể sử dụng đoạn mã sau để tạo ra các hình thức theo yêu cầu:

Thay vì bạn cựu

OneForm.ShowModal; 

sử dụng loại mã

if OneForm=nil then 
    OneForm := TOneForm.Create(Application); 
    OneForm.ShowModal; 

Bạn sẽ thấy tải ứng dụng nhanh hơn nhiều.

Lưu ý: Tôi chỉ đọc ra rằng vấn đề là trước khi tải biểu mẫu. Vì vậy, mẹo trên sẽ không hoạt động cho vấn đề cụ thể này. Tôi giữ câu trả lời vì nó có thể hữu ích cho người khác. Tôi sẽ đọc tốt hơn vào lần sau. :(

Trong mọi trường hợp, có nhiều mã chạy từ khởi tạo không phải là thiết kế tốt. Có vẻ như rất nhiều đối tượng hoặc biến toàn cục ... việc tái cấu trúc có thể có ý nghĩa ở đây ... :)

+0

có, vấn đề của tôi là trước khi ngay cả APplication.Initiazlize. – LaBracca

1

Bạn đã biết rằng nếu bạn có nhiều biểu mẫu, hãy thử di chuyển biểu mẫu ra khỏi danh sách "tự động tạo", sau đó thêm mã, để tạo biểu mẫu khi cần, nhưng bạn gặp phải vấn đề này trước khi thậm chí có thể tạo biểu mẫu. Vì vậy, như những người khác đã nói, phần khởi tạo là vấn đề.

blog của Jeroen của chỉ tôi tại một nguồn lực lớn để gỡ lỗi này:

http://wiert.wordpress.com/2010/07/21/delphi-great-post-by-malcolm-groves-about-debugging-initialization-and-finalization-sections/

Ông chỉ cho tôi để Malcom Groves:

http://www.malcolmgroves.com/blog/?p=649

+1

Mất 8 giây trước khi biểu mẫu tự động tạo giai đoạn. –

+0

Có, tôi chỉ có 2 tự động tạo datamodules, nhưng dù sao mã đó không được thực hiện vấn đề của tôi là trước khi Application.Initialize. – LaBracca

1

Có rất nhiều gợi ý tốt trong this question .

Bạn hoàn toàn chắc chắn rằng bạn không tạo ra những thứ khi khởi động mà bạn không cần ngay lập tức. Đây thường là sự chậm trễ khởi động lớn nhất đối với các dự án có nhiều hình thức.

Trong trường hợp của bạn, có vẻ như rất nhiều mã khởi tạo đang được thực thi.

Các vấn đề liên quan