Beyond Stack Sampling: C ++ Profilers


146

Câu chuyện của Hacker

Ngày là 12/02/10. Những ngày trước Giáng sinh đang trôi đi và tôi đã gặp phải một kẻ cản đường lớn với tư cách là một lập trình viên Windows. Tôi đã sử dụng AQTime, tôi đã thử buồn ngủ, sáng bóng và rất buồn ngủ, và như chúng tôi nói, VTune đang cài đặt. Tôi đã thử sử dụng trình biên dịch VS2008 và nó đang bị trừng phạt tích cực cũng như thường không thể chịu được. Tôi đã sử dụng kỹ thuật tạm dừng ngẫu nhiên. Tôi đã kiểm tra cây gọi. Tôi đã loại bỏ dấu vết chức năng. Nhưng sự thật đau lòng của vấn đề là ứng dụng tôi đang làm việc có hơn một triệu dòng mã, với các ứng dụng của bên thứ ba có thể trị giá hàng triệu dòng khác.

Tôi cần các công cụ tốt hơn. Tôi đã đọc các chủ đề khác. Tôi đã thử từng hồ sơ được liệt kê trong mỗi chủ đề. Đơn giản là phải có một cái gì đó tốt hơn những lựa chọn đắt đỏ và đắt tiền này, hoặc số lượng công việc lố bịch mà hầu như không thu được. Để làm phức tạp thêm vấn đề, mã của chúng tôi bị xâu chuỗi nhiều và chạy một số vòng lặp Qt Event, một số trong đó rất mong manh đến nỗi chúng bị hỏng dưới thiết bị nặng do sự chậm trễ thời gian. Đừng hỏi tôi tại sao chúng ta đang chạy nhiều vòng sự kiện. Không ai có thể nói với tôi.

Có lựa chọn nào khác dọc theo dòng Valgrind trong môi trường windows không?
Có điều gì tốt hơn so với hàng loạt công cụ bị hỏng mà tôi đã thử không?
Có bất cứ điều gì được thiết kế để tích hợp với Qt, có lẽ với màn hình hiển thị các sự kiện hữu ích trong hàng đợi không?

Một danh sách đầy đủ các công cụ tôi đã thử, với những công cụ thực sự hữu ích in nghiêng:

  • AQTime: Khá tốt! Có một số rắc rối với đệ quy sâu, nhưng biểu đồ cuộc gọi là chính xác trong những trường hợp này và có thể được sử dụng để xóa bất kỳ sự nhầm lẫn nào bạn có thể có. Không phải là một công cụ hoàn hảo, nhưng đáng để thử. Nó có thể phù hợp với nhu cầu của bạn, và nó chắc chắn là đủ tốt cho tôi hầu hết thời gian.
  • Tấn công tạm dừng ngẫu nhiên trong chế độ gỡ lỗi: Không đủ thông tin đủ thời gian.
    Một công cụ tốt nhưng không phải là một giải pháp hoàn chỉnh.
  • Parallel Studios: Tùy chọn hạt nhân. Đáng ghét, kỳ lạ, và mạnh mẽ điên cuồng. Tôi nghĩ bạn nên đánh giá 30 ngày và tìm hiểu xem nó có phù hợp không. Nó cũng thật tuyệt.
  • AMD Codeanalyst: Tuyệt vời, dễ sử dụng, rất dễ bị sập, nhưng tôi nghĩ đó là một điều môi trường. Tôi khuyên bạn nên thử nó, vì nó là miễn phí.
  • Luke Stackwalker: Hoạt động tốt trên các dự án nhỏ, có một chút cố gắng để nó hoạt động trên các dự án của chúng tôi. Một số kết quả tốt mặc dù, và nó chắc chắn thay thế Buồn ngủ cho các nhiệm vụ cá nhân của tôi.
  • PurifyPlus: Không hỗ trợ cho môi trường Win-x64, nổi bật nhất là Windows 7. Nếu không thì tuyệt vời. Một số đồng nghiệp của tôi ở các phòng ban khác thề.
  • VS2008 Profiler: Tạo đầu ra trong phạm vi hợp đồng 100+ trong chế độ theo dõi chức năng ở độ phân giải yêu cầu. Về mặt tích cực, tạo ra kết quả vững chắc.
  • GProf: Yêu cầu GCC phải có hiệu quả vừa phải.
  • VTune: Biên giới hỗ trợ W7 của VTune về tội phạm. Nếu không thì xuất sắc.
  • PIN: Tôi cần phải hack công cụ của riêng tôi, vì vậy đây là loại cuối cùng.
  • Buồn ngủ \ VerySaddy: Hữu ích cho các ứng dụng nhỏ hơn, nhưng không thành công ở đây.
  • EasyProfiler: Không tệ nếu bạn không bận tâm một chút về mã được chèn thủ công để chỉ ra vị trí của thiết bị.
  • Valgrind: * chỉ nix, nhưng rất tốt khi bạn ở trong môi trường đó.
  • OProfile: Chỉ Linux.
  • Proffy: Họ bắn ngựa hoang.

Các công cụ được đề xuất mà tôi chưa thử:

  • XPerf:
  • Glowcode:
  • Người chia sẻ:

Ghi chú: Môi trường Intel tại thời điểm này. VS2008, tăng thư viện. Qt 4+. Và tất cả các humdinger khốn khổ của tất cả: tích hợp Qt / MFC thông qua trolltech.


Bây giờ: Gần hai tuần sau, có vẻ như vấn đề của tôi đã được giải quyết. Nhờ có nhiều công cụ, bao gồm hầu hết mọi thứ trong danh sách và một vài mánh khóe cá nhân của tôi, chúng tôi đã tìm ra những điểm nghẽn chính. Tuy nhiên, tôi sẽ tiếp tục thử nghiệm, khám phá và thử các trình biên dịch mới cũng như công nghệ mới. Tại sao? Bởi vì tôi nợ các bạn, vì các bạn đá. Nó làm chậm dòng thời gian xuống một chút, nhưng tôi vẫn rất hào hứng khi tiếp tục thử các công cụ mới.

Tóm tắt
Trong số nhiều vấn đề khác, một số thành phần gần đây đã được chuyển sang mô hình luồng không chính xác, gây ra tình trạng treo máy nghiêm trọng do thực tế là mã bên dưới chúng tôi đột nhiên không còn đa luồng. Tôi không thể nói nhiều hơn vì nó vi phạm NDA của tôi, nhưng tôi có thể nói với bạn rằng điều này sẽ không bao giờ được tìm thấy bằng cách kiểm tra thông thường hoặc thậm chí bằng cách xem xét mã thông thường. Không có hồ sơ, thư pháp và tạm dừng ngẫu nhiên kết hợp, chúng tôi vẫn sẽ hét lên giận dữ của chúng tôi tại vòng cung màu xanh tuyệt đẹp của bầu trời. Rất may, tôi làm việc với một số tin tặc giỏi nhất mà tôi từng gặp và tôi có quyền truy cập vào một câu thơ tuyệt vời với đầy đủ các công cụ tuyệt vời và những người tuyệt vời.

Gentlefolk, tôi đánh giá cao điều này và chỉ tiếc rằng tôi không có đủ đại diện để thưởng cho mỗi bạn một tiền thưởng. Tôi vẫn nghĩ rằng đây là một câu hỏi quan trọng để có câu trả lời tốt hơn những câu hỏi mà chúng ta đã có từ trước đến nay về SO.

Kết quả là, mỗi tuần trong ba tuần tiếp theo, tôi sẽ đưa ra số tiền thưởng lớn nhất mà tôi có thể chi trả, và trao giải thưởng cho câu trả lời bằng công cụ đẹp nhất mà tôi nghĩ không phải là kiến ​​thức phổ biến. Sau ba tuần, chúng tôi hy vọng sẽ tích lũy được một hồ sơ dứt khoát của các trình hồ sơ, nếu bạn tha thứ cho sự khôn ngoan của tôi.

Take-Away
Sử dụng một hồ sơ. Chúng đủ tốt cho Ritchie, Kernighan, Bentley và Knuth. Tôi không quan tâm bạn nghĩ bạn là ai. Sử dụng một hồ sơ. Nếu cái bạn có không hoạt động, hãy tìm cái khác. Nếu bạn không thể tìm thấy một, mã một. Nếu bạn không thể mã hóa một, hoặc đó là một sự cố nhỏ hoặc bạn đang bị mắc kẹt, hãy sử dụng tạm dừng ngẫu nhiên. Nếu vẫn thất bại, hãy thuê một số học sinh tốt nghiệp để tạo ra một hồ sơ.


Một cái nhìn dài hơn
Vì vậy, tôi nghĩ rằng nó có thể tốt để viết lên một chút hồi tưởng. Tôi đã chọn làm việc rộng rãi với Parallel Studios, một phần vì nó thực sự được xây dựng dựa trên Công cụ PIN. Đã có những thỏa thuận học thuật với một số nhà nghiên cứu có liên quan, tôi cảm thấy rằng đây có lẽ là một dấu ấn của một số chất lượng. Rất may, tôi đã đúng. Mặc dù GUI hơi khủng khiếp, tôi thấy IPS cực kỳ hữu ích, mặc dù tôi không thể thoải mái giới thiệu nó cho mọi người. Quan trọng, không có cách rõ ràng nào để có được số lần truy cập cấp độ dòng, điều mà AQT và một số trình biên dịch khác cung cấp, và tôi thấy rất hữu ích để kiểm tra tỷ lệ lựa chọn chi nhánh trong số những thứ khác. Trong mạng, tôi cũng rất thích sử dụng AQTime và tôi thấy hỗ trợ của họ thực sự phản hồi. Một lần nữa, tôi phải đủ điều kiện giới thiệu: Rất nhiều tính năng của chúng không hoạt động tốt và một số trong số chúng hoàn toàn dễ bị lỗi trên Win7x64. XPerf cũng thực hiện một cách đáng ngưỡng mộ, nhưng lại chậm chạp về chi tiết lấy mẫu cần thiết để có được đọc tốt trên một số loại ứng dụng.

Ngay bây giờ, tôi phải nói rằng tôi không nghĩ có một tùy chọn dứt khoát để cấu hình mã C ++ trong môi trường W7x64, nhưng chắc chắn có những tùy chọn đơn giản là không thực hiện bất kỳ dịch vụ hữu ích nào.


18
Bạn đã tìm kiếm một công việc khác nhau? :)
Nikolai Fetissov

10
Nơi nào khác tôi sẽ có được để giải câu đố khó khăn này? Tôi đoán tôi có thể quay lại hack kernel, nhưng điều đó cũng không trả tiền.
Jake Kurzer

3
@Kos Tôi nghĩ rằng gprof sẽ được sử dụng mà bạn phải sử dụng bộ công cụ gcc được biên dịch bằng -pg nếu không nó không tạo ra tệp gprof.out. Trong trường hợp của OP, có vẻ như anh ta đang sử dụng msvc, quy tắc sử dụng gprof. Sau đó, một lần nữa tôi không nghĩ rằng gprof sẽ công bằng hơn cho anh ta nếu những người khác trong danh sách không đáp ứng nhu cầu của anh ta
Greatwolf

2
@Marc Gravell Điều đó đủ công bằng, tôi cho rằng .... Có vẻ như một heuristic kỳ lạ đối với tôi, rằng các bài đăng được duy trì tốt nhất đột ngột chuyển sang miền cộng đồng, tạo ra một tình huống mà bạn càng cập nhật và duy trì câu hỏi hoặc câu trả lời của mình , bạn càng ít thoát khỏi sự bảo trì đó trong mắt cộng đồng nói chung. Tôi có nên đưa cái này lên meta không?
Jake Kurzer

2
Có ai muốn một hồi tưởng, đưa ra những gì tôi biết bây giờ về hồ sơ?
Jake Kurzer

Câu trả lời:


65

Đầu tiên:

Trình biên dịch lấy mẫu thời gian mạnh hơn trình biên dịch lấy mẫu CPU. Tôi không quen thuộc lắm với các công cụ phát triển Windows nên tôi không thể nói đó là công cụ nào. Hầu hết các trình biên dịch là lấy mẫu CPU.

Một trình hồ sơ lấy mẫu CPU lấy một dấu vết ngăn xếp mỗi N hướng dẫn.
Kỹ thuật này sẽ tiết lộ các phần mã của bạn bị ràng buộc CPU. Thật tuyệt vời nếu đó là cổ chai trong ứng dụng của bạn. Không tuyệt vời lắm nếu các chủ đề ứng dụng của bạn dành phần lớn thời gian để chiến đấu với một mutex.

Một trình hồ sơ lấy mẫu thời gian lấy một dấu vết ngăn xếp cứ sau N micro giây.
Kỹ thuật này sẽ không có mã "chậm" . Cho dù nguyên nhân là do CPU bị ràng buộc, chặn các ràng buộc IO, ràng buộc mutex hoặc các phần đập mã bộ đệm. Nói tóm lại, đoạn mã nào đang làm chậm ứng dụng của bạn sẽ nổi bật.

Vì vậy, sử dụng một hồ sơ lấy mẫu thời gian nếu có thể, đặc biệt là khi lược tả mã luồng.

Thứ hai:

Hồ sơ lấy mẫu tạo ra gobs dữ liệu. Dữ liệu cực kỳ hữu ích, nhưng thường có quá nhiều để dễ dàng hữu ích. Một trực quan hóa dữ liệu hồ sơ giúp rất nhiều ở đây. Công cụ tốt nhất tôi tìm thấy để hiển thị dữ liệu hồ sơ là gprof2dot . Đừng để cái tên đánh lừa bạn, nó xử lý tất cả các loại đầu ra hồ sơ lấy mẫu (AQtime, Sleepy, XPerf, v.v.). Khi trực quan hóa đã chỉ ra (các) chức năng vi phạm, hãy quay lại dữ liệu hồ sơ thô để có gợi ý tốt hơn về nguyên nhân thực sự là gì.

Công cụ gprof2dot tạo ra một mô tả biểu đồ chấm mà sau đó bạn đưa vào một công cụ graphviz . Đầu ra về cơ bản là một biểu đồ với các chức năng được mã hóa màu bởi tác động của chúng đối với ứng dụng. văn bản thay thế

Một vài gợi ý để có được gprof2dot để tạo đầu ra đẹp.

  • Tôi sử dụng --skew0,001 trên biểu đồ của mình để có thể dễ dàng nhìn thấy các đường dẫn mã nóng. Nếu không thì int main()thống trị đồ thị.
  • Nếu bạn đang làm bất cứ điều gì điên rồ với các mẫu C ++, có lẽ bạn sẽ muốn thêm --strip. Điều này đặc biệt đúng với Boost.
  • Tôi sử dụng OProfile để tạo dữ liệu lấy mẫu của mình. Để có được đầu ra tốt, tôi cần cấu hình nó để tải các biểu tượng gỡ lỗi từ thư viện hệ thống và bên thứ 3 của tôi. Hãy chắc chắn làm như vậy, nếu không, bạn sẽ thấy CRT đang chiếm 20% thời gian của ứng dụng của bạn khi những gì thực sự đang diễn ra malloclà phá hủy đống và ăn tới 15%.

Mặc dù tôi không biết rằng đây là câu trả lời đầy đủ cho các vấn đề của mình, nhưng gprof2dot đã vào kho vũ khí rộng lớn của tôi và nhanh chóng thừa nhận một vị trí yêu thích. Tôi nghĩ rằng đó là giá trị tiền thưởng!
Jake Kurzer

2
Tôi đã hỏi câu hỏi này dựa trên mẫu hồ sơ dựa trên mẫu thời gian Linux . OProfile được cho là lấy mẫu dựa trên thời gian cuối cùng. Họ sản xuất chất lượng rất cao, vì vậy một khi họ thêm tính năng đó tôi sẽ sử dụng chúng. Ngoài ra, tôi đã có một người bạn hack cùng nhau một giải pháp gdb + backtrace để định hình. Rất hack, nhưng nó đã tìm thấy nút cổ chai.
deft_code

@deft_code: "hack cùng một giải pháp gdb + backtrace để định hình. Rất hack, nhưng nó đã tìm thấy nút cổ chai." Bạn đang xác nhận sự giận dữ liên tục của tôi :) Một số người muốn hồ sơ đẹp, nhưng nếu kết quả là những gì bạn cần, hãy đi với những gì hoạt động, không phải những gì đẹp .
Mike Dunlavey

Tôi đồng ý với Mike Dunlavey. Những thứ như XPerf / WPA trông rất đẹp và mạnh mẽ, nhưng việc tìm ra cách sử dụng các công cụ này mất một thời gian và vào cuối ngày, việc tạm dừng ngẫu nhiên rất dễ dàng và cung cấp thông tin tốt hơn để giải quyết vấn đề. Nhiều giải pháp tự động dường như thường xuyên hơn là không lọc ra thông tin quan trọng cần thiết để giải quyết nút thắt.
JDiMatteo

16

Điều gì đã xảy ra khi bạn cố gắng tạm dừng ngẫu nhiên? Tôi sử dụng nó mọi lúc trên một ứng dụng quái vật. Bạn nói rằng nó không cung cấp đủ thông tin và bạn đã đề nghị bạn cần độ phân giải cao. Đôi khi mọi người cần một chút giúp đỡ trong việc hiểu làm thế nào để sử dụng nó.

Những gì tôi làm, trong VS, là cấu hình hiển thị ngăn xếp để nó không hiển thị cho tôi các đối số chức năng, vì điều đó làm cho hiển thị ngăn xếp hoàn toàn không thể đọc được, IMO.

Sau đó, tôi lấy khoảng 10 mẫu bằng cách nhấn "tạm dừng" trong thời gian nó khiến tôi chờ đợi . Tôi sử dụng ^ A, ^ C và ^ V để sao chép chúng vào notepad để tham khảo. Sau đó, tôi nghiên cứu từng người, để cố gắng tìm ra những gì nó đang trong quá trình cố gắng để hoàn thành tại thời điểm đó.

Nếu nó đang cố gắng hoàn thành một cái gì đó trên 2 mẫu trở lên và điều đó không thực sự cần thiết, thì tôi đã tìm thấy một vấn đề trực tiếp và tôi biết khoảng cách khắc phục nó sẽ tiết kiệm được bao nhiêu.

Có những điều bạn không thực sự cần biết, như phần trăm chính xác không quan trọng, và những gì diễn ra bên trong mã của bên thứ 3 không quan trọng, vì bạn không thể làm gì về những điều đó . Những gì bạn có thể làm một cái gì đó là tập hợp các điểm gọi phong phú trong mã mà bạn có thể sửa đổi được hiển thị trên mỗi mẫu ngăn xếp. Đó là nơi săn bắn hạnh phúc của bạn.

Ví dụ về các loại điều tôi tìm thấy:

  • Trong quá trình khởi động, nó có thể sâu khoảng 30 lớp, trong quá trình cố gắng trích xuất các chuỗi ký tự được quốc tế hóa từ tài nguyên DLL. Nếu các chuỗi thực tế được kiểm tra, có thể dễ dàng nhận ra rằng các chuỗi không thực sự cần được quốc tế hóa, giống như chúng là các chuỗi mà người dùng không bao giờ thực sự nhìn thấy.

  • Trong quá trình sử dụng bình thường, một số mã vô tình đặt thuộc tính Sửa đổi trong một số đối tượng. Đối tượng đó đến từ một siêu hạng nắm bắt sự thay đổi và kích hoạt các thông báo gợn sóng trong toàn bộ cấu trúc dữ liệu, thao túng giao diện người dùng, tạo và hủy bỏ các chướng ngại vật theo những cách khó có thể thấy trước. Điều này có thể xảy ra rất nhiều - hậu quả bất ngờ của thông báo.

  • Điền vào một bảng tính theo từng hàng, từng ô. Hóa ra nếu bạn xây dựng hàng cùng một lúc, từ một mảng các giá trị, nó sẽ nhanh hơn rất nhiều.

PS Nếu bạn đa luồng, khi bạn tạm dừng nó, tất cả các luồng tạm dừng. Hãy nhìn vào ngăn xếp cuộc gọi của từng chủ đề. Rất có thể, chỉ một trong số họ là thủ phạm thực sự, và những người khác đang rảnh rỗi.


2
Bình luận? Bình luận? ĐÂY LÀ SPARTA! Tôi ... Xin lỗi, không biết nó đến từ đâu. Không, mã làm cho Klingon Opera trông có thể đọc được và nó cũng được ghi lại. Trên thực tế, tôi nghĩ rằng nó ít tài liệu hơn .... Trời ơi.
Jake Kurzer

3
Tích hợp QTMFC? Ôi thật tuyệt, bạn đã trở nên phức tạpxấu xa , và bạn thậm chí còn chưa nhận được mã dành riêng cho ứng dụng.
Ben Voigt

5
QT / MFC? Không nên tạo ra những đứa trẻ đột biến với 3 cái đầu lắc lư trong khi gọi mọi ý tưởng mà chúng nghe thấy ý tưởng ngu ngốc nhất? Xin lỗi ... Tôi lạc đề ... Nếu bạn đang sử dụng bất kỳ lớp MFC nào, hãy viết lại mã ổ cắm của bạn và lập hồ sơ. Có ALOT các vị trí trong mã CSocket sử dụng phiên bản vòng lặp thông báo của WaitForSingleObject mà tôi đã tìm thấy để giết hiệu suất. Đối với cuộc sống của tôi, tôi không thể nhớ tên của người chờ đợi ...: /
JimR

2
Trời ơi, tin tôi đi, nó chính xác như bạn nghĩ.
Jake Kurzer

3
@Jake: Không thoải mái lắm, nhưng đó là vinh quang của tính phổ quát Turing. Bất kỳ ngôn ngữ nào, dù ở mức độ cao hay thấp, đều tương đương với khả năng không bị ràng buộc của nó.
Mike Dunlavey

8

Tôi đã có một số thành công với AMD CodeAnalyst .


Môi trường Intel, tại thời điểm này. Tôi sẽ ghi nhớ nó! :)
Jake Kurzer

4
@Jake: Tôi không chắc ý của bạn là gì ở đó. AMD CodeAnalyst không yêu cầu chip AMD, nó nên hoạt động trên hầu hết các chip x86 hoặc x64 (còn gọi là x86-64 / IA-64 / AMD64), bao gồm cả chip Intel.
Adam Rosenfield

1
Rõ ràng, tôi không biết chữ! Đó là tin tuyệt vời. Tôi sẽ thử nó vào ngày mai và cập nhật câu hỏi.
Jake Kurzer

Cho đến nay, nó rất không ổn định khi lấy mẫu ở độ phân giải tôi cần.
Jake Kurzer

@Adam: Tôi đã thử phân tích mã trên máy intel pentium IV gần đây và nó chỉ cung cấp lấy mẫu dựa trên thời gian, không có thông tin về việc sử dụng luồng, cũng như thông tin liên quan đến luồng nào ... lượng thông tin tôi nhận được thực sự rất tầm thường .. Ngoài ra, nó đã gây ra sự cố trong tích hợp qt của studio hình ảnh .. tôi không hài lòng :(
smerlin

7

Bạn có chức năng MFC OnIdle không? Trước đây, tôi có một ứng dụng gần thời gian thực, tôi phải sửa lỗi đó là bỏ các gói nối tiếp khi được đặt ở tốc độ 19,2K mà PentiumD cần có thể theo kịp. Chức năng OnIdle là thứ đã giết chết mọi thứ. Tôi không chắc chắn nếu QT có khái niệm đó, nhưng tôi cũng sẽ kiểm tra nó.


2
Chúng tôi thực sự có một OnIdle, và nhờ tích hợp QTMFC của chúng tôi, nó chảy qua vòng lặp sự kiện ... ev ... eve .... Oh G'd.
Jake Kurzer

Hóa ra điều này dẫn trực tiếp đến giải pháp của chúng tôi, vì vậy trong khi đó không phải là một câu trả lời hoàn hảo cho câu hỏi, tôi nghĩ rằng câu hỏi này không thể trả lời được.
Jake Kurzer

4

Re Prof Profiler - nếu nó tạo ra các tệp lớn như vậy, có lẽ khoảng thời gian lấy mẫu của bạn quá thường xuyên? Hãy thử hạ nó xuống, vì dù sao bạn cũng có thể có đủ mẫu.

Và lý tưởng nhất, đảm bảo bạn không thu thập mẫu cho đến khi bạn thực sự thực hiện khu vực có vấn đề. Vì vậy, bắt đầu với việc thu thập tạm dừng, hãy để chương trình của bạn thực hiện "hoạt động chậm" của nó, sau đó bắt đầu thu thập. Bạn chỉ cần tối đa 20 giây của bộ sưu tập. Dừng bộ sưu tập sau này.

Điều này sẽ giúp giảm kích thước tệp mẫu của bạn và chỉ nắm bắt những gì cần thiết cho phân tích của bạn.


Tôi sẽ cho nó một shot vào ngày mai.
Jake Kurzer

4

Tôi đã sử dụng thành công PurifyPlus cho Windows. Mặc dù nó không rẻ, IBM cung cấp một phiên bản dùng thử hơi bị tê liệt. Tất cả những gì bạn cần để định hình với định lượng là các tệp pdb và liên kết với / CỐ ĐỊNH: KHÔNG. Hạn chế duy nhất: Không hỗ trợ Win7 / 64.


Thật không may, mục tiêu chính của chúng tôi là Win7. Tôi sẽ thêm thông tin đó vào bài viết chính.
Jake Kurzer

1
Phiên bản hiện tại của PurifyPlus hỗ trợ Win7 / 64.
hmuelner

3

Easyprofiler - Tôi chưa thấy nó được đề cập ở đây nên chưa chắc bạn đã xem nó chưa. Nó có một cách tiếp cận hơi khác trong cách thu thập dữ liệu số liệu. Một nhược điểm khi sử dụng cách tiếp cận hồ sơ thời gian biên dịch của nó là bạn phải thay đổi cơ sở mã. Do đó, bạn sẽ cần phải có một số ý tưởng về nơi chậm có thể và chèn mã hồ sơ vào đó.

Đi theo những bình luận mới nhất của bạn, có vẻ như bạn ít nhất đang thực hiện một số bước tiến. Có lẽ công cụ này có thể cung cấp một số số liệu hữu ích cho bạn. Nếu không có gì khác, nó có một số biểu đồ và hình ảnh thực sự thuần khiết: P


3

Thêm hai gợi ý công cụ.

Luke Stackwalker có một cái tên dễ thương (ngay cả khi nó cố gắng một chút theo sở thích của tôi), nó sẽ không tốn bất cứ thứ gì và bạn có được mã nguồn. Nó tuyên bố để hỗ trợ các chương trình đa luồng, quá. Vì vậy, nó chắc chắn là giá trị một spin.

http://lukestackwalker.sourceforge.net/

Ngoài ra Glowcode, mà tôi đã chỉ ra cho tôi là đáng sử dụng:

http://www.glowcode.com/

Thật không may, tôi đã không thực hiện bất kỳ công việc PC nào trong một thời gian, vì vậy tôi đã không thử một trong hai. Tôi hy vọng những lời đề nghị là giúp đỡ nào.


3

Thanh toán XPerf

Đây là hồ sơ miễn phí, không xâm lấn và mở rộng được cung cấp bởi MS. Nó được Microsoft phát triển để cấu hình Windows.


3

Nếu bạn nghi ngờ về vòng lặp sự kiện, có thể ghi đè QCoreApplication :: notify () và hồ sơ thủ công dosome (một hoặc hai bản đồ của người gửi / sự kiện để đếm / thời gian)?

Tôi nghĩ rằng trước tiên bạn đăng nhập tần suất của các loại sự kiện, sau đó kiểm tra các sự kiện đó cẩn thận hơn (đối tượng nào gửi nó, nó chứa gì, v.v.). Tín hiệu trên các luồng được xếp hàng ngầm, vì vậy chúng kết thúc trong vòng lặp sự kiện (rõ ràng cũng có các kết nối xếp hàng rõ ràng).

Chúng tôi đã thực hiện nó để bẫy và báo cáo các trường hợp ngoại lệ trong trình xử lý sự kiện của chúng tôi, vì vậy thực sự, mọi sự kiện đều diễn ra ở đó.

Chỉ là một ý tưởng.


Đó là một ý tưởng đáng yêu! Tôi không quen với môi trường QT, đã thực hiện hầu hết các công việc của mình với pyGTK từ trước đến nay. Cảm ơn bạn!
Jake Kurzer

Bạn có một cách khuyến nghị tìm nguồn cung ứng và giải quyết bản chất của các tín hiệu nhất định?
Jake Kurzer

Tôi chỉ thực hiện nó cho các tín hiệu với QStateMachine :: SignalEvent, dường như không giống nhau. Nguồn vẫn phải là QObject* objecttham số. Có thể MetaCall là loại cho tất cả các tín hiệu (có vẻ như có khả năng), nhưng tôi không chắc chắn. Điều này vượt xa kinh nghiệm của tôi một chút, nhưng nhìn trộm vào nguồn Qt có thể lượm lặt được một số sự thật. (Hoặc, hỏi một câu hỏi nhọn hơn wrt que gọi tín hiệu ở đây trên SO .. :)
Macke

2

Chỉnh sửa: Tôi thấy bây giờ bạn đã đề cập đến điều này trong bài viết đầu tiên của bạn. Khỉ thật, tôi chưa bao giờ nghĩ mình là người đó.

Bạn có thể sử dụng Ghim để ghi mã của bạn với độ chi tiết mịn hơn. Tôi nghĩ rằng Pin sẽ cho phép bạn tạo một công cụ để đếm số lần bạn nhập một hàm hoặc bao nhiêu đồng hồ bạn dành ở đó, mô phỏng đại khái một cái gì đó như VTune hoặc CodeAnalyst. Sau đó, bạn có thể loại bỏ các chức năng nào được thiết bị cho đến khi vấn đề thời gian của bạn biến mất.


Trên thực tế, mã PIN là thứ tôi đạt được đầu tiên. Thực sự có một thứ gọi là PIN Play sẽ hoàn hảo, nhưng nó không được phát hành ngoài Intel. Tôi không chắc là mình đã nhớ đủ về việc sử dụng mã PIN để kết hợp một thứ gì đó thực sự tốt, nhưng ...
Jake Kurzer

2

Tôi có thể nói với bạn những gì tôi sử dụng hàng ngày.

a) Nhà phân tích mã AMD

  • Thật dễ dàng, và nó sẽ cung cấp cho bạn một cái nhìn tổng quan nhanh chóng về những gì đang xảy ra. Nó sẽ ổn trong hầu hết thời gian.
  • Với CPU AMD, nó sẽ cho bạn biết thông tin về đường ống cpu, nhưng bạn chỉ cần điều này nếu bạn có các vòng lặp nặng, như trong các công cụ đồ họa, codec video, v.v.

b) VTune.

  • Nó được tích hợp rất tốt trong vs2008

  • sau khi bạn biết các điểm nóng, bạn cần lấy mẫu không chỉ thời gian, mà cả những thứ khác như lỗi nhớ cache và sử dụng bộ nhớ. Điều này rất quan trọng . Thiết lập phiên lấy mẫu và chỉnh sửa các thuộc tính. Tôi luôn lấy mẫu theo thời gian, đọc / ghi bộ nhớ và nhớ cache (ba lần chạy khác nhau)

Nhưng hơn cả công cụ, bạn cần có kinh nghiệm với hồ sơ. Và điều đó có nghĩa là hiểu cách CPU / Bộ nhớ / PCI hoạt động ... vì vậy, đây là tùy chọn thứ 3 của tôi

c) Kiểm tra đơn vị

Điều này rất quan trọng nếu bạn đang phát triển một ứng dụng lớn cần hiệu năng lớn. Nếu bạn không thể chia ứng dụng thành một số phần, sẽ rất khó để theo dõi việc sử dụng cpu. Tôi không kiểm tra tất cả các trường hợp và các lớp, nhưng tôi đã thực thi mã hóa cứng và các tệp đầu vào với các tính năng quan trọng.

Lời khuyên của tôi là sử dụng lấy mẫu ngẫu nhiên trong một số thử nghiệm nhỏ và cố gắng chuẩn hóa chiến lược hồ sơ.


Nhà phân tích mã AMD không ổn định trong môi trường nhà phát triển của tôi và VTune rõ ràng không hỗ trợ nó. : S
Jake Kurzer

2

Tôi sử dụng xperf / ETW cho tất cả các nhu cầu định hình của mình. Nó có một đường cong học tập dốc nhưng vô cùng mạnh mẽ. Nếu bạn đang định hình trên Windows thì bạn phải biết xperf. Tôi thường xuyên sử dụng trình lược tả này để tìm các vấn đề về hiệu suất trong mã của tôi và mã của người khác.

Trong cấu hình mà tôi sử dụng nó:

  • xperf lấy các mẫu CPU từ mọi lõi đang thực thi mã mỗi ms. Tốc độ lấy mẫu có thể tăng lên 8 KHz và các mẫu bao gồm chế độ người dùng và mã hạt nhân. Điều này cho phép tìm ra những gì một chủ đề đang làm trong khi nó đang chạy
  • xperf ghi lại mọi chuyển đổi ngữ cảnh (cho phép tái cấu trúc hoàn hảo thời gian mỗi luồng sử dụng), cộng với các ngăn xếp cuộc gọi khi các luồng được chuyển đổi, cộng với các ngăn xếp cuộc gọi để xử lý chuỗi khác, cho phép theo dõi chuỗi chờ và tìm hiểu tại sao một chuỗi không chạy
  • xperf ghi lại tất cả I / O tệp từ tất cả các quy trình
  • xperf ghi lại tất cả I / O đĩa từ tất cả các quy trình
  • xperf ghi lại cửa sổ nào đang hoạt động, tần số CPU, trạng thái nguồn CPU, độ trễ UI, v.v.
  • xperf cũng có thể ghi lại tất cả các phân bổ heap từ một quy trình, tất cả các phân bổ ảo từ tất cả các quy trình và nhiều hơn nữa.

Đó là rất nhiều dữ liệu, tất cả trên một dòng thời gian, cho tất cả các quy trình. Không có hồ sơ nào khác trên Windows có thể làm điều đó.

Tôi đã viết blog rất nhiều về cách sử dụng xperf / ETW. Những bài đăng trên blog và một số video đào tạo chất lượng chuyên nghiệp, có thể được tìm thấy ở đây: http://randomascii.wordpress.com/2014/08/19/etw-training-video-av Available-now /

Nếu bạn muốn tìm hiểu điều gì có thể xảy ra nếu bạn không sử dụng xperf, hãy đọc các bài đăng trên blog này: http://randomascii.wordpress.com/carget/investigative-reporting/ Đây là những câu chuyện về vấn đề hiệu suất tôi đã tìm thấy trong mã của người khác , điều đó nên được tìm thấy bởi các nhà phát triển. Điều này bao gồm mshtml.dll được tải vào trình biên dịch VC ++, từ chối dịch vụ trong các tệp tìm kiếm của VC ++, điều chỉnh nhiệt trong một số lượng máy đáng ngạc nhiên, bước chậm một bước trong Visual Studio, phân bổ 4 GB trong một khó khăn trình điều khiển đĩa, một lỗi hiệu suất powerpoint, và nhiều hơn nữa.


1

Tôi vừa hoàn thành phiên bản có thể sử dụng đầu tiên của CxxProf , một thư viện cấu hình thủ công di động cho C ++.

Nó đáp ứng các mục tiêu sau:

  • Tích hợp dễ dàng
  • Dễ dàng loại bỏ lib trong thời gian biên dịch
  • Dễ dàng loại bỏ lib trong thời gian chạy
  • Hỗ trợ cho các ứng dụng đa luồng
  • Hỗ trợ cho các hệ thống phân tán
  • Giữ tác động ở mức tối thiểu

Những điểm này được trích xuất từ wiki dự án , hãy xem ở đó để biết thêm chi tiết.

Tuyên bố miễn trừ trách nhiệm: Tôi là nhà phát triển chính của CxxProf


1

Chỉ cần vứt nó đi, mặc dù nó không phải là một trình tạo hồ sơ đầy đủ: nếu tất cả những gì bạn theo sau là các vòng lặp sự kiện mất nhiều thời gian để xử lý một sự kiện, một công cụ đặc biệt là vấn đề đơn giản trong Qt. Cách tiếp cận đó có thể dễ dàng được mở rộng để theo dõi xem mỗi sự kiện đã diễn ra trong bao lâu và những sự kiện đó là gì, v.v. Nó không phải là một hồ sơ phổ quát, mà là một vòng lặp sự kiện trung tâm.

Trong Qt, tất cả các cuộc gọi khe tín hiệu xuyên luồng được phân phối thông qua vòng lặp sự kiện, cũng như các bộ định thời, thông báo cổng và cổng nối tiếp và tất cả các tương tác của người dùng ,. Do đó, quan sát các vòng lặp sự kiện là một bước tiến lớn để hiểu được ứng dụng đang sử dụng thời gian ở đâu.


0

DevPartner, ban đầu được phát triển bởi NuMega và hiện được phân phối bởi MicroF Focus, đã từng là giải pháp được lựa chọn để định hình và phân tích mã (ví dụ rò rỉ bộ nhớ và tài nguyên). Tôi đã không thử nó gần đây, vì vậy tôi không thể đảm bảo với bạn rằng nó sẽ giúp bạn; nhưng tôi đã từng có kết quả tuyệt vời với nó, vì vậy đây là một giải pháp thay thế tôi xem xét để cài đặt lại trong quy trình chất lượng mã của chúng tôi (họ cung cấp bản dùng thử 14 ngày)


0

mặc dù hệ điều hành của bạn là win7, chương trình không thể chạy dưới xp? làm thế nào về hồ sơ dưới xp và kết quả sẽ là một gợi ý cho win7.


Chắc chắn là có thể, nhưng điều đó sẽ đòi hỏi phải mua giấy phép cho một sản phẩm có thể không bao giờ hỗ trợ tốt cho nhà phát triển mong muốn của bạn, hoặc có thể mất nhiều năm để làm như vậy. 1,5k là rất nhiều tiền để đặt cược, cộng với chi phí về thời gian chụp ảnh và triển khai một hộp xp.
Jake Kurzer

0

Có rất nhiều hồ sơ được liệt kê ở đây và tôi đã tự mình thử một vài trong số chúng - tuy nhiên cuối cùng tôi đã tự viết dựa trên điều này:

http://code.google.com.vn/p/high-performance-cplusplus-profiler/

Tất nhiên, nó yêu cầu bạn sửa đổi cơ sở mã, nhưng nó hoàn hảo để thu hẹp các nút thắt cổ chai, nên hoạt động trên tất cả các x86 (có thể là một vấn đề với các hộp đa lõi, tuy nhiên, nó sử dụng ndtsc - tuy nhiên, đây hoàn toàn là thời gian chỉ định - vì vậy tôi thấy nó đủ cho nhu cầu của mình ..)



Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.