2008-09-24 27 views
12

Ứng dụng của chúng tôi mất nhiều thời gian hơn để khởi động sau khi khởi động lại (khởi động nguội) hơn nếu nó đã được mở một lần (khởi động ấm).So sánh khởi động nguội bắt đầu ấm

Hầu hết (nếu không phải tất cả) sự khác biệt dường như đến từ việc tải các tệp DLL, khi các tệp DLL nằm trong các trang bộ nhớ đệm mà chúng tải nhanh hơn nhiều. Chúng tôi đã thử sử dụng ClearMem để mô phỏng khởi động lại (vì tốn ít thời gian hơn nhiều so với thực tế khởi động lại) và có kết quả hỗn hợp, trên một số máy dường như mô phỏng khởi động lại rất nhất quán và trong một số không.

Tóm lại câu hỏi của tôi là:

  1. Bạn đã trải qua sự khác biệt về thời gian khởi động giữa bắt đầu lạnh và ấm áp?
  2. Bạn đã làm cách nào với sự khác biệt như vậy?
  3. Bạn có biết cách mô phỏng một cách đáng tin cậy để khởi động lại không?

Edit:

Làm rõ cho ý kiến:

  • Ứng dụng này chủ yếu có nguồn gốc C++ với một số NET (NET lắp ráp đầu tiên đó là nạp trả tiền cho CLR).
  • Chúng tôi đang tìm cách cải thiện thời gian tải, rõ ràng là chúng tôi đã chia sẻ hồ sơ của chúng tôi và cải thiện các điểm nóng trong mã của chúng tôi.

Điều tôi quên đề cập đến là chúng tôi đã cải thiện một số bằng cách căn cứ vào tất cả các tệp nhị phân của chúng tôi để trình tải không phải thực hiện nó khi tải.

+0

Motti, bạn có ý tưởng mới về mô phỏng khởi động lại không? Tôi đang tìm kiếm cách như vậy cho ứng dụng rất lớn của chúng tôi là tốt nhưng không tìm thấy một cách chắc chắn –

+0

@Dbger, xin lỗi tôi đã không thực hiện bất kỳ tiến bộ bổ sung về điều này, tôi chuyển sang các vấn đề khác nhau. Chúc may mắn. – Motti

Trả lời

3

Bạn đã cấu hình mã của mình như thế nào? Không phải tất cả các phương pháp lược tả đều bình đẳng và một số tìm thấy các điểm nóng tốt hơn so với các phương pháp khác. Bạn đang tải nhiều tệp?Nếu vậy, phân mảnh ổ đĩa và tìm kiếm thời gian có thể đi vào chơi.

Có thể thậm chí gắn thời gian cơ bản informatino vào mã và ghi ra tệp nhật ký và kiểm tra tệp khi khởi động nguội/ấm sẽ giúp xác định trong đó ứng dụng đang dành thời gian của chúng.

Không có thêm thông tin, tôi sẽ dựa vào bộ nhớ cache của hệ thống tệp/đĩa vì khả năng khác biệt giữa hai môi trường. Nếu đó là trường hợp, sau đó bạn cần phải dành ít thời gian tải các tập tin trả trước, hoặc tìm cách tải các tập tin nhanh hơn. Một ví dụ (có thể không áp dụng) là nếu bạn đang tải các tệp dữ liệu nhị phân là kết hợp tất cả chúng vào một tệp, hãy thực hiện một đoạn của toàn bộ tệp vào bộ nhớ trong một lần đọc rồi phân tích nội dung của chúng. Ít đĩa hơn và thời gian đọc hết đĩa. Một lần nữa, có thể điều đó không áp dụng. Tôi không biết bất kỳ công cụ nào để xóa bộ nhớ đệm/hệ thống tệp, nhưng bạn có thể viết một ứng dụng nhanh để đọc một loạt các tệp không liên quan khỏi đĩa để khiến bộ nhớ cache/hệ thống tệp được tải với thông tin khác.

+0

Tôi sẽ xem xét việc hợp nhất các tệp DLL có vẻ giống như một tùy chọn đầy hứa hẹn. – Motti

+2

Từ các triệu chứng, có vẻ như điều tốn thời gian đang tải mã thay vì thời gian thực thi của mã khởi tạo. Trong trường hợp đó, một hồ sơ sẽ không giúp đỡ (ngoại trừ, có thể, để xem bạn đã thực hiện tiến bộ về việc cải thiện thời gian tải). Giảm số lượng DLL phải tải, làm cho chúng nhỏ hơn, rebase chúng để không có sự chồng chéo. Đăng ký truy cập cũng có thể gây đau khi khởi động mới. –

6

Để mô phỏng khởi động lại, bạn có xem xét chạy ứng dụng của mình từ một số virtual PC không? Sử dụng ảo hóa, bạn có thể sao chép thuận tiện một tập hợp các điều kiện lặp đi lặp lại.

Tôi cũng xem xét một số loại profiling app để phát hiện bit mã gây ra độ trễ thời gian và sau đó thực hiện cuộc gọi phán đoán về số lượng mã đó thực sự cần thiết hoặc nếu nó có thể đạt được theo một cách khác.

+1

Vấn đề với máy ảo (chúng tôi sử dụng VMWare không phải Virtual PC) là họ tải cân bằng mọi thứ (bao gồm cả CPU) và các con số chúng tôi nhận được không nhất quán. – Motti

+1

Điểm lấy, mặc dù tôi nghi ngờ bằng cách tái tạo lại bạn đang theo đuổi các triệu chứng chứ không phải là nguyên nhân gốc rễ. Thực tế vẫn còn rằng có một cái gì đó cách quá tốn thời gian xảy ra trong một DLL bất kể khi nó tải, khởi động lại cứng chỉ làm trầm trọng thêm vấn đề. Im tự tin một công cụ lược tả sẽ giúp bạn ở đây –

+0

:) Cảm ơn bạn đã giải thích thêm –

4

Thật khó để thực sự mô phỏng khởi động lại trong phần mềm. Khi bạn khởi động lại, tất cả các thiết bị trong máy của bạn nhận được bit đặt lại được xác nhận, điều này sẽ làm cho toàn bộ toàn bộ hệ thống bị mất. Trong một máy tính hiện đại, bạn có bộ nhớ và lưu trữ ở khắp mọi nơi: có hệ thống con VM lưu trữ các trang bộ nhớ cho chương trình, sau đó bạn đã có hệ điều hành lưu trữ nội dung của các tệp trong bộ nhớ, thì bạn đã có bộ đệm trên đĩa của các sector trên đĩa cứng. Bạn có thể nhận được bộ đệm hệ điều hành để được thiết lập lại, nhưng bộ đệm trên đĩa trên ổ đĩa? Tôi không biết một cách nào.

0

Một cách để làm cho ứng dụng bắt đầu khởi động nguội nhanh hơn (loại) được sử dụng, ví dụ: Trình đọc Adobe, bằng cách tải một số tệp khi khởi động, do đó ẩn phần khởi động nguội từ người dùng. Điều này chỉ có thể sử dụng được nếu chương trình không được khởi động ngay lập tức.

Một lưu ý khác là .NET 3.5SP1 được cho là có tốc độ khởi động lạnh được cải thiện nhiều, mặc dù tôi không thể nói được bao nhiêu.

+0

Đây là điều xấu, và một trong những lý do tôi không cài đặt trình đọc Adobe. –

0

Có thể là NIC (Thẻ LAN) và ứng dụng của bạn phụ thuộc vào các dịch vụ khác nhất định yêu cầu mạng phải xuất hiện. Vì vậy, hồ sơ ứng dụng của bạn một mình có thể không hoàn toàn cho bạn biết điều này, nhưng bạn nên kiểm tra các phụ thuộc cho ứng dụng của bạn.

+0

Đây không phải là trường hợp, chúng tôi hoàn toàn là phía khách hàng. – Motti

2

@Morten Christiansen nói:

Một cách để làm cho các ứng dụng khởi động lạnh-khởi động nhanh hơn (loại) được sử dụng bởi ví dụ Trình đọc Adobe, bằng cách tải một số tệp khi khởi động, do đó ẩn phần khởi động nguội từ người dùng. Điều này chỉ có thể sử dụng được nếu chương trình không được khởi động ngay lập tức.

Điều đó làm cho các khách hàng trả cho khởi tạo ứng dụng của chúng tôi lúc khởi động mỗi ngay cả khi nó không được sử dụng, tôi thực sự không thích lựa chọn đó (cũng như thế Raymond).

2

Một cách thành công để tăng tốc độ khởi động ứng dụng là chuyển đổi các tệp DLL để trì hoãn tải. Đây là một thay đổi chi phí thấp (một số thay đổi với cài đặt dự án) nhưng có thể làm cho khởi động nhanh hơn đáng kể. Sau đó, chạy depends.exe trong chế độ lược tả để tìm ra tệp DLL nào sẽ nạp trong khi khởi động, và hoàn nguyên việc tải trễ lên chúng. Hãy nhớ rằng bạn cũng có thể trì hoãn tải hầu hết các tệp DLL Windows mà bạn cần.

2

Một kỹ thuật rất hiệu quả để cải thiện thời gian khởi động ứng dụng nguội là tối ưu hóa thứ tự liên kết chức năng.

Trình liên kết Visual Studio cho phép bạn chuyển một tệp liệt kê tất cả các chức năng trong mô-đun đang được liên kết (hoặc chỉ một số trong số đó không phải là tất cả) và trình liên kết sẽ đặt các hàm đó tiếp theo với nhau trong bộ nhớ.

Khi ứng dụng của bạn khởi động, thường có các lệnh gọi hàm init trong suốt ứng dụng của bạn. Nhiều cuộc gọi trong số này sẽ đến một trang chưa có trong bộ nhớ, dẫn đến lỗi trang và tìm kiếm đĩa. Đó là nơi khởi động chậm.

Tối ưu hóa ứng dụng của bạn để tất cả các chức năng này cùng nhau có thể là một chiến thắng lớn.

Kiểm tra tối ưu hóa hướng dẫn về cấu hình trong Visual Studio 2005 trở lên. Một trong những điều mà PGO làm cho bạn là chức năng liên kết đặt hàng.

Có một chút khó khăn trong quá trình xây dựng, vì với PGO bạn cần liên kết, hãy chạy ứng dụng của bạn và sau đó liên kết lại với đầu ra từ cấu hình chạy.Điều này có nghĩa là quá trình xây dựng của bạn cần phải có môi trường thời gian chạy và thỏa thuận dọn dẹp sau khi xây dựng xấu và tất cả điều đó, nhưng khoản hoàn trả thường là 10+ hoặc nhanh hơn khi khởi động nguội mà không có thay đổi mã.

Có một số thông tin thêm về PGO đây:

http://msdn.microsoft.com/en-us/library/e7k32f4k.aspx

+0

Cảm ơn, tôi sẽ kiểm tra. BTW khi bạn nói 10+ bạn có nghĩa là 10%? – Motti

1

Để thay thế cho chức năng danh sách theo thứ tự, chỉ nhóm mã mà sẽ được gọi trong các phần giống nhau:

#pragma code_seg(".startUp") 
//... 
#pragma code_seg 

#pragma data_seg(".startUp") 
//... 
#pragma data_seg 

Nó nên dễ bảo trì khi mã của bạn thay đổi, nhưng có cùng lợi ích như danh sách thứ tự chức năng.

Tôi không chắc liệu danh sách thứ tự chức năng có thể chỉ định biến toàn cục hay không, nhưng sử dụng #pragma data_seg này sẽ chỉ hoạt động.

0

Nếu ứng dụng của bạn không phức tạp, bạn chỉ có thể sao chép tất cả các tệp thi hành vào một thư mục khác, nó sẽ tương tự như khởi động lại. (Cắt và dán có vẻ không hoạt động, Windows đủ thông minh để biết các tệp di chuyển sang thư mục khác được lưu trong bộ nhớ)

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