2008-12-15 32 views
21

Tôi đang gặp một số vấn đề về hiệu suất với ứng dụng Delphi 2006 của mình. bạn có thể đề nghị bất kỳ công cụ profiling rằng sẽ giúp tôi tìm ra chai cổCông cụ lược tả Delphi

tức là Một công cụ như tuabin Profiler

+0

http://www.prodelphi.de/ – Ampere

+0

Đây là phần mềm miễn phí và dễ sử dụng (so với ProDelphi). delphitools.info/downloads/samplingprofiler-changelog – Ampere

Trả lời

24

Tôi hỏi cùng question không quá lâu trước

Tôi đã tải về và thử AQTime. Nó có vẻ toàn diện, nhưng nó không phải là một công cụ dễ sử dụng và là rất đắt đối với một lập trình viên riêng lẻ (tức là 600 đô la Mỹ). Tôi thích thực tế rằng nó không xâm lấn (không thay đổi mã của bạn), và nó có thể làm theo từng dòng, cho đến khi tôi thấy rằng bởi vì nó là một trình biên tập thiết bị, nó có thể dẫn đến việc tối ưu hóa không đúng như sau: Why is CharInSet faster than Case statement?

Tôi đã thử bản trình diễn ProDelphi, ít tốn kém hơn (khoảng 80 đô la), nhưng nó quá phức tạp với tôi - tôi không thích giao diện người dùng, và nó xâm lấn - thay đổi mã của bạn để thêm nhạc cụ, mà bạn phải cẩn thận.

Tôi đã sử dụng GpProfile với Delphi 4 trong nhiều năm. Tôi yêu nó. Nó cũng xâm lấn, nhưng nó hoạt động rất tốt, tôi đã học cách tin tưởng nó và nó không bao giờ cho tôi một vấn đề trong 10 năm. Nhưng khi tôi nâng cấp lên Delphi 2009, tôi đã không nghĩ rằng tốt nhất nên thử sử dụng nó, vì nó chưa được nâng cấp và bởi việc nhập học của GP, sẽ không hoạt động nếu không có sửa đổi. Tôi hy vọng bạn sẽ không thể sử dụng nó với Delphi 2006.

ProDelphi và GpProfile sẽ chỉ cấu hình ở cấp quy trình. Nếu bạn muốn thực hiện các dòng riêng lẻ (mà đôi khi tôi phải làm), bạn phải gọi PROC1, PROC2, PROC3 cho mỗi dòng và đặt một dòng trong mỗi PROC. Đó là một chút khó chịu khi phải làm điều đó, nhưng nó đã cho tôi kết quả tốt (ít nhất tôi đã hài lòng với kết quả của GpProfile làm điều đó).

Câu trả lời tôi chấp nhận trong câu hỏi CharInSet của tôi cho biết rằng "Trình lấy mẫu, định kỳ kiểm tra vị trí của CPU, thường tốt hơn để đo thời gian mã." và sau đó, answer đã cung cấp hồ sơ lấy mẫu miễn phí của Eric Grange cho Delphi hiện hỗ trợ Delphi 2009. Tôi chưa thử, nhưng tôi đã nghe những điều tốt đẹp về nó, và đó là bài tiếp theo tôi sẽ thử.

Bằng cách này, bạn có thể tốt nhất bằng cách tiết kiệm $ 600 bằng cách KHÔNG mua AQtime và thay vào đó sử dụng để nâng cấp Delphi 2006 lên Delphi 2009. Tính ổn định, tốc độ và tính năng bổ sung (expecially Unicode) thời gian của bạn. Xem: What are major incentives to upgrade to D2009 (Unicode excluded)?

Ngoài ra AQtime chưa tích hợp vào Delphi 2009.

Một tài khoản miễn phí khác, với nguồn mà tôi đã tìm hiểu, nhưng chưa thử là TProfiler. Nếu có ai đó thử cái đó, tôi muốn biết họ nghĩ gì.


Lưu ý: Phần bổ sung mà tôi đã thêm sau đó vào question 291631 có vẻ như là câu trả lời. Xem Andre's open source program: asmprofiler


Tháng 2 năm 2010 theo dõi. Tôi cắn viên đạn và mua AQTime. Một vài tháng trước, họ cuối cùng đã tích hợp nó vào Delphi 2009, đó là những gì tôi sử dụng (nhưng họ vẫn phải làm Delphi 2010). Việc xem các dòng nguồn và thời gian và số lượng cá nhân của họ là vô giá đối với tôi, và AQTime thực hiện công việc tuyệt vời này.

+0

Tôi chắc rằng AQTime 6 sẽ tích hợp với Delphi 2009. – lukeck

+0

Kể từ ngày 15 tháng 12 năm 2008, nó không có. Khi tôi không thể tải xuống bản dùng thử của mình để tích hợp, tôi đã liên lạc với AutomatedQA và họ nói họ vẫn đang làm việc này. AQTime 6.10 sẽ chỉ hoạt động với Delphi 2009 như một chương trình riêng biệt. – lkessler

+0

AQTime 6.30 đã được phát hành vào tháng 11 năm 2009 và cuối cùng đã được tích hợp vào Delphi 2009. Nhưng tất nhiên, Delphi 2010 đã hết, và không, AQTime chưa có tích hợp với điều đó. Có lẽ một năm chờ đợi cho những người D2010. – lkessler

3

www.AutomatedQA.com đã lựa chọn tốt nhất cho Delphi profiling (AQTime)

+2

Hãy lưu ý rằng AQA dựa trên thiết bị đo đạc và không định hình, và do đó nó sẽ cho kết quả gây hiểu lầm cho các tắc nghẽn rất chi tiết. –

+0

s/không profiling/không lấy mẫu/ –

-1

cuối cùng lưu ý, www.torry.net là một gre tại vị trí cho tìm kiếm thành phần/công cụ Delphi

+7

Darian, thay vì thêm 4 câu trả lời cho một câu hỏi, chỉnh sửa câu trả lời đầu tiên của bạn để cung cấp tất cả các thông tin, và xóa khác 3. –

5

Tôi đã sử dụng http://www.prodelphi.de với thành công trên dự án Delphi 7 trong quá khứ. Giá rẻ và hoạt động. Đừng để trang web bush league dọa bạn đi.

3

Tôi sử dụng và gợi ý Trình lấy mẫu, tôi nghĩ bạn có thể lấy nó từ embarcadeiro.public, tệp tin đính kèm.

+0

Bây giờ nó là trên http://delphitools.info/ –

11

Tôi vừa tìm thấy một rất đẹp miễn phí sampling profiler và nó hỗ trợ Delphi 2009

+0

Làm việc với delphi 7 - cảm ơn cho điều này. Lưu ý, hãy đảm bảo bật thông tin gỡ lỗi TD32 trong tùy chọn trình liên kết. –

8

Tôi đã sử dụng ProDelphi, chủ yếu là để xác định thói quen đang ăn nhiều thời gian nhất. Nó là một Instrumenting Profiler, có nghĩa là nó thêm một chút mã vào đầu và cuối của mỗi thường trình. Bạn kiểm soát những thói quen nó hồ sơ bằng cách chỉ thị bên trong ý kiến. Bạn cũng có thể cấu hình các phần của một thường trình. Nhưng các phần phải bắt đầu và dừng ở cùng một cấp độ khối, không có mục nhập hoặc thoát ra khỏi phần. Tối ưu hóa phải được tắt nơi ProDelphi chèn mã của nó (nơi bạn đặt các chỉ thị), nhưng bạn có thể biến nó ở bất cứ nơi nào khác.

Giao diện là kinda klunky, nhưng rất nhanh khi bạn nhận được hang của nó. Bạn có thể làm việc hữu ích với phiên bản miễn phí (giới hạn trong 10 thói quen hoặc phần). ProDelphi có thể nhanh chóng cho bạn biết bạn nên kiểm tra những thói quen nào. Nhưng không phải lý do tại sao, hoặc những dòng.

Gần đây, tôi đã bắt đầu sử dụng Trình phân tích hiệu suất VTune của Intel. 'WOW' không bắt đầu tổng hợp nó. Tôi là ấn tượng. Tôi chỉ đơn giản là không có ý tưởng tất cả điều này được xây dựng vào bộ xử lý Intel hiện đại. Bạn có biết nó có thể cho bạn biết chính xác tần suất một lệnh duy nhất cần để chờ Cache dữ liệu L1 nhìn sang một bên khác trước khi tải lại một từ từ bộ nhớ cache cao hơn không? Nếu tôi tiếp tục viết, tôi sẽ âm thanh như một quảng cáo không ngớt cho sản phẩm.

Đi tới Intel và tải xuống bản trình diễn có thời gian làm việc đầy đủ. Tìm hiểu về một số video về cách bắt đầu. (Nếu không, bạn có nguy cơ bị cản trở bởi tất cả các tùy chọn.) Nó hoạt động với bất kỳ trình biên dịch nào. Chỉ cần trỏ nó vào một .exe. Nó sẽ hiển thị cho bạn các dòng nguồn nếu tệp .exe của bạn bao gồm thông tin gỡ lỗi & bạn trỏ nó tới mã nguồn.


Tôi đã cố gắng tối ưu hóa vòng lặp bên trong gọi là hàm tôi đã viết. Không có cuộc gọi bên ngoài ngoại trừ chiều dài (str). Vòng lặp bên trong này chạy hàng tỷ lần mỗi lần chạy, và ăn khoảng một nửa thời gian cpu - một ứng cử viên hoàn hảo để tối ưu hóa. Tôi đã thử tất cả các loại tối ưu hóa tiêu chuẩn, với ít hoặc không có hiệu lực. VTune cho thấy các điểm nóng. Tôi chỉ cần khoan cho đến khi nó cho tôi thấy mã ASM của tôi được tạo ra, và lượng thời gian mà mỗi lệnh được thực hiện.

Đây là những gì VTune nói với tôi:

  • dòng nnnn [dòng mã delphi] ...
  • addr hhhh cmp byte ptr [edx + ecx], 0x14h - - - - - - - - 3 chu kỳ
  • addr hhhh ja label_x - - - - - - - - - - - - - - - - - -10302 cycle

Giá trị tuyệt đối không có nghĩa là gì. (Tôi nghĩ rằng tôi đã đo chu kỳ mỗi hướng dẫn đã nghỉ hưu.) Các giá trị tương đối làm cho nó kinda rõ ràng, nơi tất cả các thời gian đi. Điều tuyệt vời là cửa sổ tư vấn. Nó nói với tôi mã bị trì hoãn chờ dữ liệu tải vào bộ đệm dữ liệu L1, và thực sự đã cho tôi lời khuyên tốt về cách tránh các quầy hàng.

Lỗi lầm của tôi là suy nghĩ về Core2 Quad như một CPU 8086 thực sự nhanh. Không^3. Mã đã dành 99% thời gian chờ dữ liệu tải từ bộ nhớ vì tôi đã nhảy quá nhiều. Thuật toán của tôi giả định rằng bộ nhớ là RAM (Truy cập ngẫu nhiên). Đó không phải là cách CPU hiện đại hoạt động. Dữ liệu trong bộ nhớ cache L1 có thể được truy cập trong 1 hoặc 2 chu kỳ, nhưng việc truy cập bộ nhớ cache L2 hoặc L3 tốn hàng chục đến hàng trăm chu kỳ và chi phí RAM hàng ngàn. Tuy nhiên, tất cả độ trễ đó sẽ tránh được khi bạn truy cập dữ liệu tuần tự - bởi vì bộ xử lý sẽ tải trước bộ nhớ cache với dữ liệu theo byte đầu tiên bạn yêu cầu.

Kết quả ròng là tôi đã viết lại thuật toán để truy cập dữ liệu tuần tự hơn và có tốc độ gấp 10 lần, đủ tốt. Khi tôi có thời gian, tôi chắc chắn tôi có thể nhận được 10 lần nữa. Nhưng đó chỉ là Geek trong tôi. Đủ tốt là đủ tốt.

Tôi đã biết rằng bạn nhận được nhiều nhất bằng cách tối ưu hóa thuật toán, chứ không phải mã của bạn. Tôi nghĩ rằng tôi chỉ cần profiler để cho tôi biết những gì cần tối ưu hóa. Nhưng tôi cũng cần nó để tìm lý do cho nút cổ chai để tôi có thể thiết kế một thuật toán nhanh hơn.

Thuật toán mới hoàn toàn khác với thuật toán cũ. Nó chỉ lưu trữ dữ liệu sao cho nó có thể được truy cập tuần tự. Ví dụ, ở một nơi tôi đã di chuyển một trường từ một mảng các bản ghi vào mảng riêng của các số nguyên - bởi vì vòng lặp bên trong không cần phần còn lại của dữ liệu trong mỗi bản ghi. Tôi cũng có một ma trận hình chữ nhật được lưu trữ như một mảng động của mảng động. Mã được sử dụng để truy cập ngẫu nhiên megabyte dữ liệu (và bộ nhớ cache dữ liệu L1 kém chỉ là 64Kb). Tôi đã tìm ra cách lưu trữ nó trong một mảng tuyến tính như là đường chéo của ma trận, đó là thứ tự tôi sử dụng dữ liệu. (OK, có thể là một phần cấp tiến.)

Dù sao, tôi được bán trên VTune.

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