2009-07-12 31 views
14

Bạn làm gì để tăng tốc độ khởi động (hoặc giảm thời gian khởi động) của ứng dụng Delphi?Làm cách nào để tăng tốc độ khởi động của ứng dụng delphi?

Khác với ứng dụng cụ thể, có thủ thuật tiêu chuẩn nào luôn hoạt động không?

Lưu ý: Tôi không nói về thuật toán nhanh hoặc lượt thích. Chỉ có sự gia tăng hiệu suất khi khởi động, về mặt tốc độ.

Trả lời

19

Hãy thử làm ít nhất có thể trong sự kiện OnCreate của biểu mẫu chính. Thay vì , hãy chuyển một số khởi tạo sang phương thức khác và thực hiện sau khi biểu mẫu được hiển thị cho người dùng. Một chỉ báo cho biết ứng dụng đang bận với con trỏ chuột bận sẽ đi một chặng đường dài.

Thử nghiệm được thực hiện cho thấy nếu bạn thực hiện chính xác cùng một ứng dụng và chỉ cần thêm thông báo khởi động vào đó, người dùng thực sự cảm nhận ứng dụng đó khi khởi động nhanh hơn!

Ngoài ra bạn có thể làm những việc thông thường như loại trừ thông tin gỡ lỗi và bật tối ưu hóa trong trình biên dịch.

Trên hết, không tự động tạo tất cả các biểu mẫu của bạn. Tạo chúng động khi bạn cần chúng.

+0

Vì vậy, thông báo khởi động tốt là gì? Tôi không thích màn hình giật gân cá nhân. Còn gì nữa? –

+0

Bất cứ điều gì từ thông báo trạng thái cho người dùng biết bạn đang làm gì sau khi biểu mẫu chính của bạn được hiển thị cho một nhãn nhỏ ở đâu đó trên biểu mẫu chính. Thanh tiến trình cũng hữu ích nếu có thể, thay vào đó là thanh tiến trình quay. – Maltrap

+3

@utku Tôi hiểu bạn không thích màn hình giật gân, nhưng chúng hữu ích khi biểu mẫu chính không hiển thị ngay lập tức. Nếu không, người dùng của bạn có thể không biết ứng dụng đã bắt đầu và cố gắng khởi chạy lại ứng dụng. –

28

Trong tùy chọn dự án, không tự động tạo tất cả biểu mẫu của bạn ở phía trước. Tạo và giải phóng chúng khi cần.

+7

+1 - và để tôi thêm: mở bất kỳ kết nối nào, có thể là cơ sở dữ liệu, internet, COM hoặc bất kỳ thứ gì, vào thời điểm bạn cần nó trước. –

+1

@Uwe: nhận xét của bạn là khác biệt đủ để nó phải là một câu trả lời riêng biệt. Tôi sẽ làm điều đó ngoại trừ tôi trông giống như một con chó săn, và mặc dù tôi có thể trả lời CW của tôi, nhưng sau đó bạn sẽ không nhận được đại diện. – Argalatyr

+0

@Argalatyr: Cảm ơn đề xuất –

13

Ba sự việc xảy ra trước khi hình thức của bạn được hiển thị: khối

  1. Tất cả 'khởi' trong tất cả các đơn vị được thực hiện theo thứ tự "đầu tiên nhìn thấy".
  2. Tất cả biểu mẫu được tạo tự động được tạo (được tải từ các tệp DFM và trình xử lý OnCreate của chúng được gọi)
  3. Biểu mẫu chính được hiển thị (OnShow và OnActivate được gọi).

Như đã chỉ ra, bạn chỉ nên tạo tự động một số ít biểu mẫu (đặc biệt nếu chúng là các biểu mẫu phức tạp với nhiều thành phần) và không nên xử lý lâu dài trong các sự kiện OnCreate. Nếu tình cờ, hình thức chính của bạn rất phức tạp, bạn nên thiết kế lại nó. Một khả năng là chia biểu mẫu chính thành nhiều khung hình được tải theo yêu cầu.

Cũng có thể một trong các khối khởi tạo đang dành một chút thời gian để thực thi. Để xác minh, hãy đặt một điểm ngắt trên dòng đầu tiên của chương trình của bạn (chính 'bắt đầu..đọc' khối trong tệp .dpr) và bắt đầu chương trình. Tất cả khối khởi tạo sẽ được thực hiện và sau đó điểm ngắt sẽ dừng thực thi.

Theo cách tương tự, bạn có thể bước (F8) qua chương trình chính - bạn sẽ thấy mất bao lâu cho mỗi biểu mẫu được tạo tự động được tạo.

17

Vâng, như Argalatyr đề nghị tôi thay đổi nhận xét của tôi đến một câu trả lời riêng biệt:

Là một phần mở rộng của "không tự động tạo các biểu mẫu" câu trả lời (mà sẽ được khá hiệu quả bởi chính nó) Tôi đề nghị hoãn mở kết nối với cơ sở dữ liệu, internet, máy chủ COM và bất kỳ thiết bị ngoại vi nào cho đến khi bạn cần nó trước.

4

Hiển thị màn hình giật gân, vì vậy mọi người sẽ không nhận thấy thời gian khởi động dài :).

+0

Và nó hoạt động như một hình thức xây dựng thương hiệu sản phẩm. –

1

Mã nhanh nhất - đó là mã, không bao giờ chạy. Khá rõ ràng, thực sự;)

+0

Rõ ràng ... đúng. Nhưng điều đó cũng không hữu ích. – jpfollenius

2

Triển khai ứng dụng có thể (và thường xảy ra!) Xảy ra theo cách mà nhà phát triển có thể chưa cân nhắc. Theo kinh nghiệm của tôi, điều này tạo ra nhiều vấn đề hiệu suất hơn bất kỳ ai muốn.

Một nút cổ chai phổ biến là truy cập tệp - tệp cấu hình, tệp ini cần thiết để khởi chạy ứng dụng có thể hoạt động tốt trên máy phát triển nhưng thực hiện quá trình trong các tình huống triển khai khác nhau. Tương tự, việc ghi nhật ký ứng dụng có thể cản trở hiệu suất - cho dù vì lý do truy cập tệp hay tăng trưởng tệp nhật ký. Những gì tôi thấy thường xuyên là các ứng dụng đa ứng dụng được triển khai trong môi trường Citrix hoặc trên ổ đĩa mạng chia sẻ, nơi nhóm cơ sở hạ tầng quyết định rằng tệp tạm thời hoặc tệp cá nhân của người dùng được lưu trữ ở vị trí mà ứng dụng tìm thấy sự cố và điều này dẫn đến các vấn đề về hiệu suất hoặc độ ổn định.

Một vấn đề khác mà tôi thường thấy ảnh hưởng đến hiệu suất ứng dụng là phương pháp được sử dụng để nhập và xuất dữ liệu vào tệp. Thông thường trong các ứng dụng kinh doanh Delphi tôi thấy chức năng xuất khẩu làm việc ra DataSets - lặp và ghi vào tập tin. Xem xét phương thức được sử dụng để ghi vào tệp, xem xét bộ nhớ có sẵn, xem xét rằng 'thư mục' được ghi vào/đọc từ có thể là cục bộ cho máy, hoặc nó có thể nằm trên máy chủ từ xa.

Nhà phát triển có thể cho rằng đây là những vấn đề cài đặt, nằm ngoài phạm vi quan tâm của họ. Tôi thường thấy nhiều chu kỳ phân tích nhà phát triển về loại vấn đề này trước khi nó được xác định là 'vấn đề cơ sở hạ tầng'.

2
  • Điều đầu tiên cần làm là xóa tự động danh sách biểu mẫu đã tạo (tìm kiếm Dự án Tùy chọn). Tạo các biểu mẫu khi đang bay khi cần, đặc biệt nếu ứng dụng sử dụng kết nối cơ sở dữ liệu (datamodule) hoặc các biểu mẫu bao gồm sử dụng nhiều điều khiển.
  • Xem xét sử dụng hình thức thừa kế cũng để giảm kích thước exe (sử dụng tài nguyên được mimized)
  • số Giảm các hình thức và hợp nhất các chức năng tương tự hoặc có liên quan vào hình thức đơn
+0

Sử dụng thừa kế để giảm kích thước EXE? Nghe có vẻ kỳ quặc với tôi ... có lẽ bạn có thể giải thích ý bạn là gì. Và nếu bạn theo dõi điểm đầu tiên của bạn, điểm cuối cùng của bạn có thể sẽ không cần thiết ... – jpfollenius

+0

Giả sử bạn có một ứng dụng db hai bảng. Và bạn có hai dạng dữ liệu danh sách khác nhau về cơ bản. Và bạn có các điều khiển kích hoạt các hoạt động CRUD bằng các hình thức khác. Nếu bạn sử dụng một số mẫu thiết kế và di chuyển 'logic' ra khỏi các biểu mẫu này thì bạn sẽ không tạo biểu mẫu cho mỗi bảng. Nhưng bạn vẫn có một điểm trong câu nói đầu tiên và cuối cùng của tôi có một số mâu thuẫn trong một cách. Hy vọng lời giải thích này làm cho nó một chút rõ ràng. (Và nói với bạn để làm như vậy không có nghĩa là tôi luôn luôn có thể thực hiện nó thành công :)) – user114285

2

Đặt nhiệm vụ chạy dài (kết nối mở cơ sở dữ liệu, kết nối với máy chủ ứng dụng, v.v.) phải được thực hiện khi khởi động trong một chuỗi. Bất kỳ chức năng nào phụ thuộc vào các tác vụ này đều bị vô hiệu hóa cho đến khi hoàn thành chuỗi.

Đó là một chút gian lận. Biểu mẫu chính xuất hiện ngay lập tức nhưng bạn chỉ cho xuất hiện thời gian khởi động nhanh hơn.

2

Nén tệp thi hành của bạn và mọi tệp dll bằng cách sử dụng một cái gì đó như ASPack hoặc UPX. Thời gian giải nén nhiều hơn so với thời gian tải nhanh hơn.

UPX được sử dụng làm example cách tải FireFox nhanh hơn.

Lưu ý rằng có downsides để nén exe.

2

Đây chỉ dành cho IDE, nhưng Chris Hesick đã đăng một blog về increasing startup performance under the debugger.

+1

Mọi bài đăng trên blog từ Cris Hesick đều ngừng hoạt động ... :(Ít nhất chúng ta có thể sử dụng Archive.org ... Ai đó nên xem lại chủ đề trong bài đăng trên blog. – EMBarbosa

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