2010-02-02 40 views
5

Gần đây, sếp của tôi đã yêu cầu tôi cải thiện tốc độ khởi chạy của ứng dụng, AP được viết bằng C++. AP là một chút lớn, nó được sử dụng hơn 200 dll, Windows cần thời gian dài để nhập hàm main(). Tôi đã thử hai cách này, nhưng vẫn không thể làm cho ông chủ của chúng tôi hạnh phúc.cách cải thiện tốc độ khởi chạy ứng dụng C++

  1. chậm trễ tải dll http://msdn.microsoft.com/en-us/library/yx9zd12s(VS.80).aspx
  2. sử dụng EDITBIN để thay đổi EXE http://msdn.microsoft.com/en-us/library/xd3shwhf(VS.80).aspx

Có cách nào khác để cải thiện nó? Cảm ơn trước.

+2

Tải chậm trễ không phải là phép thuật; bạn cũng phải chắc chắn rằng bạn không _use_ những DLLs cho đến khi tốt sau khi khởi động. – MSalters

+2

Hỏi rõ ràng, nhưng bạn đã khởi động hồ sơ chưa? Điều đó nói gì với bạn? – MSalters

Trả lời

5

Bạn cần phải lập hồ sơ ứng dụng của mình để xác định nguyên nhân thực sự của sự chậm lại. Ví dụ, nó có thể được rằng bạn đang dành phần lớn thời gian trong một số thói quen khởi tạo của một trong những .dll của bạn đang tải. Đi tìm cho mình một công cụ định hình tốt và sau đó xác định nơi nút cổ chai là.

+0

bạn có thể giới thiệu công cụ để cấu hình ứng dụng của mình không? Cảm ơn. –

+0

Công cụ yêu thích của tôi là VTune. Nó không phải là miễn phí, nhưng bạn có thể tải xuống bản đánh giá 30 ngày: http://software.intel.com/en-us/intel-vtune/ –

+1

Trình lược tả sẽ không hiển thị nhiều điều thú vị, trừ khi nó biết cách cấu hình ổ cứng. –

4

Jeez! Giảm số lượng DLL đó!

Tất nhiên, nếu bạn sẽ tải 200 DLL khi khởi động, nó sẽ phát sinh nhiều lỗi trang nghiêm trọng và mất mãi mãi để khởi động (như 3ds max).

Suy nghĩ lại chiến lược DLL của bạn. Kết hợp nhiều DLL nhỏ thành các tệp lớn hơn. Tôi nghiêm túc nghi ngờ bạn cần 200+.

Và xem Raymond Chen's Five Things Every Win32 Programmer Needs to Know.

0

Một lựa chọn, và các trò chơi tâm thanh tịnh của nó, là để cung cấp một thanh tiến trình trên tải ...

Nếu mọi người có cái gì đó để nhìn vào nó sao lãng họ và làm cho nó "cảm nhận" nhanh hơn, đó là lý do tại sao có gương giữa thang máy phục vụ nhiều tầng ...

này sẽ không đánh bại một đồng hồ bấm giờ mặc dù ...

Các thay thế khác là để viết lại nó để sử dụng ít DLL. Bao nhiêu ngân sách (tiền/thời gian) bạn có là câu hỏi tiếp theo

2

Một vài điều tôi đoán bạn cần phải biết:

  • Nhiều file nhỏ là cách chậm hơn sau đó một vài tập tin lớn
  • Truy cập đĩa chậm hơn nhiều sau đó truy cập bộ nhớ (DLL cần phải được tải từ đĩa)

Giảm số lượng DLL là phải trong tình huống này. Có lẽ bạn có thể kết hợp sau đó, nhưng tôi đoán đó là một thiết kế mô-đun, có nghĩa là, hầu hết các lần, chúng không thể được kết hợp.

Bạn cũng có thể tải các tệp DLL đang sử dụng, thay vì mở chương trình và chỉ tải các DLL cần thiết để tải chương trình khi khởi động. Hoặc bạn thậm chí có thể trì hoãn việc tải các tệp DLL bằng cách bắt đầu chương trình với các DLL cần thiết và sau đó tải các tệp khác, theo thứ tự tầm quan trọng để sử dụng.

+0

Modular không có nghĩa là một lượng nhỏ các DLL. –

+0

Điều đó là chính xác. Nhưng một số mẫu thiết kế mô-đun, có thể cản trở, khi bạn muốn thay đổi cấu trúc tải hoặc tệp. – Michiel

1

Nếu bạn có quyền truy cập vào mã của các dll (hoặc một số trong số chúng), bạn có thể tìm các candiates để liên kết tĩnh. Nếu bạn có thể chuyển đổi một loạt chúng thành các thư viện tĩnh, bạn có thể tăng tốc độ khởi động của kịch bản.

1

Sử dụng cấu trúc lười của các đối tượng tĩnh.

Thay vì phải globals mà có được tạo ra trong quá trình khởi động, như thế này:

Foo foo; 
Bar bar; 

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

họ đã xây dựng theo yêu cầu với các thành ngữ sau:

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

này sẽ giúp bạn tiết kiệm một số start- tăng thời gian nếu các đối tượng tốn kém để tạo ra (ví dụ, phải xây dựng các bảng tra cứu lớn hoặc thực hiện IO nặng).

Điều này sẽ không giúp tải các tệp DLL đó.

1

Bạn đang nhận được lời khuyên tốt ở đây. Có nhiều DLL là một trong những mốt nhất thời mà bạn đang trả tiền. Ngoài ra, việc khởi tạo chúng có thể làm nhiều hơn bạn cần.

Có một cách đơn giản để cho biết thời gian rảnh. Khởi động ứng dụng dưới một IDE, chẳng hạn như Visual Studio, và trong khi nó khởi động, nhấn nút "Tạm dừng" và hiển thị ngăn xếp cuộc gọi. Làm điều này nhiều lần. Mỗi lần, bạn sẽ thấy những gì nó đang làm và, quan trọng nhất, lý do tại sao. Nếu bạn thấy rằng nó dành nhiều thời gian làm một cái gì đó mà bạn không thực sự cần, thì điều đó sẽ cho bạn biết những gì cần sửa chữa.

+0

Hồ sơ của người nghèo. Tốt đẹp. – Thomas

+0

@Thomas: Đúng, và bạn có thể ngạc nhiên về hiệu quả của nó: http://stackoverflow.com/questions/926266/performance-optimization-strategies-of-last-resort/927773#927773 –

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