Công cụ lập hồ sơ yêu thích của bạn là gì (cho C ++) [đã đóng]


82

Cho đến nay, tôi chỉ sử dụng Định lượng hợp lý. Tôi đã nghe những điều tuyệt vời về VTune của Intel, nhưng chưa bao giờ thử nó!

Chỉnh sửa: Tôi chủ yếu đang tìm kiếm phần mềm sẽ thiết bị mã, vì tôi đoán đó là cách duy nhất để có được kết quả rất tốt.


Xem thêm:

Một số trình cấu hình tốt cho C ++ gốc trên Windows là gì?


Bạn muốn 1) để đo hay bạn muốn 2) để tìm tốc độ? Nếu bạn muốn 2 và bạn nghĩ rằng yêu cầu 1, thì không phải vậy. Để tìm kiếm tốc độ, bạn không cần "kết quả rất tốt". Nếu chương trình đang dành 90% thời gian để làm điều gì đó mà bạn rất có thể loại bỏ nếu bạn biết nó là gì, các mẫu ngăn xếp sẽ hiển thị cho bạn 9 lần trong số 10. Nếu bạn nhìn vào 10 mẫu, bạn có quan tâm không nó 10 lần, 9 lần, hay 8 lần? Dù bằng cách nào, bạn biết nó là gì . Phần trăm đo được không quan trọng.
Mike Dunlavey

Câu trả lời:


35

Để phát triển linux (mặc dù một số công cụ này có thể hoạt động trên các nền tảng khác). Đây là hai tên tuổi lớn mà tôi biết, có rất nhiều tên tuổi nhỏ khác đã không phát triển tích cực trong một thời gian.


27

Đối với Linux: Google Perftools

  • Nhanh hơn valgrind (chưa, không quá mịn)
  • Không cần thiết bị đo mã
  • Đầu ra đồ họa đẹp (-> kcachegrind)
  • Có cấu hình bộ nhớ, cấu hình cpu, kiểm tra rò rỉ không

9

IMHO, lấy mẫu bằng trình gỡ lỗi là phương pháp tốt nhất. Tất cả những gì bạn cần là IDE hoặc trình gỡ lỗi cho phép bạn tạm dừng chương trình. Nó giải quyết các vấn đề về hiệu suất của bạn trước cả khi bạn cài đặt hồ sơ.


3
Đúng! Điều này làm việc tuyệt vời cho tôi. Nó không cần thiết bị đo đạc. Nó không cần cài đặt bất kỳ hồ sơ, vv. Trên linux, bạn có thể sử dụng gdb. Chương trình chạy ở tốc độ tối đa. Nhấn ctrl-c để tạm dừng. gõ 'bt' để hiển thị ngăn xếp. Sau đó, 'c' để tiếp tục, rồi ctrl-c một lần nữa. Hoạt động tuyệt vời! Vừa giảm thời gian thực hiện của tôi xuống 20%, trong một chương trình phức tạp, sử dụng kỹ thuật này. Tuyệt vời!
Hugh Perkins

@HughPerkins: Cảm ơn bạn đã chỉnh sửa và tôi rất vui vì bạn đã thành công. (Tôi cá là bạn có thể làm tốt hơn 20% :)
Mike Dunlavey

1
Có, tôi đã giảm thời gian lặp từ 1200 mili giây xuống 200 mili giây, trong vài giờ làm việc, chỉ sử dụng gdb + ctrl-c, để định vị điểm phát :-)
Hugh Perkins

@HughPerkins: Đối với tôi, nếu tôi đang làm việc trên mã của riêng mình, thật khó để biết khi nào nên ngừng cố gắng - có vẻ như tôi luôn có thể siết chặt nó thêm một chút nữa. Khi tôi đang làm việc trên mã của người khác, có thể có vấn đề. Tôi không phải lúc nào cũng có thể thuyết phục "chủ sở hữu" của mã để khắc phục sự cố, vì vậy quá trình này dừng lại. Đó là một câu hỏi hóc búa thú vị.
Mike Dunlavey

Nếu bạn chỉ muốn đạt được điều này mà không cần thiết bị đo đạc, bạn thậm chí không cần trình gỡ lỗi hoặc IDE trên Linux. Chỉ cần chạy "pstack <pid>" để ngăn xếp lệnh theo dõi hiện tại đang chạy. Nó đơn giản hơn nhiều so với việc khởi chạy Trình gỡ lỗi và sau đó phá vỡ thủ công và sau đó tìm kiếm stacktrace.
Manish Sogi

7

Kinh nghiệm duy nhất của tôi về việc lập hồ sơ mã C ++ là với AQTime của AutomatedQA (bây giờ là Phần mềm SmartBear). Nó có một số loại cấu hình được tích hợp sẵn (hiệu suất, bộ nhớ, tay cầm Windows, theo dõi ngoại lệ, phân tích tĩnh, v.v.) và công cụ mã để nhận kết quả.

Tôi rất thích sử dụng nó - thật vui khi tìm thấy những điểm mà một thay đổi nhỏ trong mã có thể tạo ra sự cải thiện đáng kể về hiệu suất.


Điều đó chỉ hoạt động trên Windows, thật không may.
Bram,

6

Tôi chưa bao giờ làm hồ sơ trước đây. Hôm qua, tôi đã lập trình một lớp ProfilingTimer với một thời gian biểu tĩnh (một bản đồ <std :: string, long long>) để lưu trữ thời gian.

Hàm tạo lưu trữ đánh dấu bắt đầu và hàm hủy sẽ tính toán thời gian đã trôi qua và thêm nó vào bản đồ:

ProfilingTimer::ProfilingTimer(std::string name)
 : mLocalName(name)
{
 sNestedName += mLocalName;
 sNestedName += " > ";

 if(sTimetable.find(sNestedName) == sTimetable.end())
  sTimetable[sNestedName] = 0;

 mStartTick = Platform::GetTimerTicks();
}

ProfilingTimer::~ProfilingTimer()
{
 long long totalTicks = Platform::GetTimerTicks() - mStartTick;

 sTimetable[sNestedName] += totalTicks;

 sNestedName.erase(sNestedName.length() - mLocalName.length() - 3);
}

Trong mọi chức năng (hoặc {block}) mà tôi muốn lập hồ sơ, tôi cần thêm:

ProfilingTimer _ProfilingTimer("identifier");

Dòng này hơi rườm rà để thêm vào tất cả các chức năng tôi muốn lập hồ sơ vì tôi phải đoán các chức năng nào mất rất nhiều thời gian. Nhưng nó hoạt động tốt và chức năng in hiển thị thời gian tiêu thụ theo%.

(Có ai khác đang làm việc với bất kỳ "hồ sơ tự làm tại nhà" nào tương tự không? Hay nó chỉ là ngu ngốc? Nhưng thật vui! Có ai có đề xuất cải thiện không?

Có một số kiểu tự động thêm một dòng vào tất cả các hàm không?)


5

Tôi đã sử dụng Glowcode rộng rãi trong quá khứ và không có gì ngoài những trải nghiệm tích cực với nó. Tích hợp Visual Studio của nó thực sự rất tốt và nó là trình biên dịch trực quan / hiệu quả nhất mà tôi từng sử dụng (thậm chí so với trình tạo hồ sơ cho mã được quản lý).

Rõ ràng, điều đó sẽ vô ích nếu bạn không chạy trên Windows, nhưng câu hỏi khiến tôi không rõ chính xác yêu cầu của bạn là gì.


5

oprofile, không nghi ngờ gì nữa; nó đơn giản, đáng tin cậy, thực hiện công việc và có thể cung cấp tất cả các loại dữ liệu phân tích tốt.


5

Hồ sơ trong Visual Studio 2008 rất tốt: nhanh, thân thiện với người dùng, rõ ràng và được tích hợp tốt trong IDE.


2
Không phải hồ sơ trong phiên bản Đội chỉ có?
dwj

@dwj: Tôi không chắc lắm. Tôi đang sử dụng Visual Studio Team System 2008 Development Edition.
Dimitri C.

Có vẻ như nó chỉ có trong phiên bản Nhóm ( stackoverflow.com/questions/61669/… ) cho các phiên bản trước năm 2010.
dwj

4

Đối với Windows, hãy xem Xperf . Nó sử dụng hồ sơ được lấy mẫu, có một số giao diện người dùng hữu ích và không yêu cầu thiết bị đo đạc. Khá hữu ích để theo dõi các vấn đề về hiệu suất. Bạn có thể trả lời những câu hỏi như:

  • Ai đang sử dụng CPU nhiều nhất? Đi sâu vào tên hàm bằng cách sử dụng ngăn xếp cuộc gọi.
  • Ai đang phân bổ bộ nhớ nhiều nhất?
  • Ai đang thực hiện nhiều truy vấn đăng ký nhất?
  • Đĩa ghi? Vân vân.

Bạn sẽ khá ngạc nhiên khi phát hiện ra các nút thắt cổ chai, vì chúng có thể không như bạn mong đợi!


3

Có các yêu cầu khác nhau cho việc lập hồ sơ. Mã công cụ có ổn không, hay bạn cần lập hồ sơ mã tối ưu hóa (hoặc thậm chí mã đã được biên dịch)? Bạn có cần thông tin hồ sơ từng dòng không? Bạn đang chạy hệ điều hành nào? Bạn có cần lập hồ sơ các thư viện được chia sẻ không? Điều gì về theo dõi các cuộc gọi hệ thống?

Cá nhân tôi sử dụng oprofile cho mọi thứ tôi làm, nhưng đó có thể không phải là lựa chọn tốt nhất trong mọi trường hợp. Vtune và Shark đều rất xuất sắc.


3

Vì bạn không đề cập đến nền tảng bạn đang làm việc, tôi sẽ nói cachegrind trong Linux. Chắc chắn. Nó là một phần của bộ công cụ Valgrind.

http://valgrind.org/info/tools.html

Tôi chưa bao giờ sử dụng tính năng phụ Callgrind của nó, vì hầu hết việc tối ưu hóa mã của tôi là dành cho các hàm bên trong .

Lưu ý rằng có sẵn KCachegrind giao diện người dùng.


3

Để phát triển Windows, tôi đã sử dụng Trình xác thực hiệu suất của Software Verification - nó nhanh, chính xác hợp lý và giá cả hợp lý. Tốt nhất, nó có thể tạo thiết bị cho một quá trình đang chạy và cho phép bạn bật và tắt thu thập dữ liệu trong thời gian chạy, cả thủ công và dựa trên callstack - tuyệt vời để lập hồ sơ một phần nhỏ của chương trình lớn hơn.


3

Đối với Windows, tôi đã thử AMD Codeanalyst, Intel VTune và trình biên dịch trong Visual Studio Team Edition.

Codeanalyst bị lỗi (thường xuyên gặp sự cố) và trên mã của tôi, kết quả của nó thường không chính xác. Giao diện người dùng của nó không trực quan. Ví dụ: để hiển thị ngăn xếp cuộc gọi trong kết quả hồ sơ, bạn phải nhấp vào tab "Processes", sau đó nhấp vào tên tệp EXE của chương trình của bạn, sau đó nhấp vào nút trên thanh công cụ có các chữ cái nhỏ "CSS" trên đó. Nhưng nó là phần mềm miễn phí, vì vậy bạn cũng có thể thử nó và nó hoạt động (với ít tính năng hơn) mà không cần bộ xử lý AMD.

VTune ($ 700) có giao diện người dùng khủng IMO; trong một chương trình lớn, thật khó để tìm cây cuộc gọi cụ thể mà bạn muốn và bạn chỉ có thể nhìn vào một "nút" trong một chương trình tại một thời điểm (một hàm có các lệnh gọi và lệnh gọi ngay lập tức của nó) - bạn không thể xem xét một cách đầy đủ gọi cây. Có một chế độ xem biểu đồ cuộc gọi, nhưng tôi không thể tìm ra cách làm cho thời gian thực hiện tương đối xuất hiện trên biểu đồ. Nói cách khác, các hàm trong biểu đồ trông giống nhau bất kể thời gian đã dành cho chúng là bao nhiêu - cứ như thể chúng hoàn toàn bỏ lỡ điểm xác định.

Hồ sơ của Visual Studio có GUI tốt nhất trong số ba, nhưng vì lý do nào đó mà nó không thể thu thập các mẫu từ phần lớn mã của tôi (các mẫu chỉ được thu thập cho một vài hàm trong toàn bộ chương trình C ++ của tôi). Ngoài ra, tôi không thể tìm thấy giá hoặc cách mua trực tiếp; nhưng nó đi kèm với đăng ký MSDN của công ty tôi. Visual Studio hỗ trợ mã được quản lý, nguyên bản và hỗn hợp; Tôi không chắc về hai hồ sơ khác trong vấn đề đó.

Tóm lại, tôi chưa biết một hồ sơ cá nhân tốt! Tôi chắc chắn sẽ kiểm tra các đề xuất khác ở đây.


3

Tôi sử dụng devpartner cho nền tảng máy tính.


Nó thực hiện công cụ mã. Nó có phạm vi bảo hiểm mã và kiểm tra giới hạn (công cụ và không kinh doanh)
EvilTeach

2

Tôi đã thử Định lượng một AQTime và Định lượng đã thắng vì các tính năng "tập trung vào cây phụ" và "xóa cây phụ" vô giá của nó.


Toàn ack. Tôi vừa phải thực hiện một số hồ sơ trên một ứng dụng C ++ và đó là những tính năng chính xác thực sự tạo nên ngày của tôi.
Enno

2

Câu trả lời nhạy cảm duy nhất là PTU từ Intel. Tất nhiên, tốt nhất là sử dụng nó trên bộ xử lý Intel và để nhận được kết quả thậm chí có giá trị hơn ít nhất là trên máy C2D vì bản thân kiến ​​trúc dễ dàng cung cấp lại các cấu hình có ý nghĩa hơn.


2

Tôi đã sử dụng VTune trên Windows và Linux trong nhiều năm với kết quả rất tốt. Các phiên bản sau này trở nên tồi tệ hơn, khi họ thuê ngoài sản phẩm đó cho đội ngũ phát triển của Nga, chất lượng và hiệu suất đều giảm (sự cố VTune tăng lên, thường là 15 phút để mở tệp phân tích).

Về thiết bị đo đạc, bạn có thể nhận ra rằng nó ít hữu ích hơn bạn nghĩ. Trong các loại ứng dụng tôi đã làm việc để thêm thiết bị đo đạc thường làm sản phẩm chậm lại đến mức nó không hoạt động nữa (câu chuyện có thật: khởi động ứng dụng, về nhà, quay lại vào ngày hôm sau, ứng dụng vẫn đang khởi động). Ngoài ra, với việc lập hồ sơ không có công cụ, bạn có thể phản ứng với các vấn đề trực tiếp. Ví dụ: với bộ thu thập ngày từ xa của VTune, tôi có thể bắt đầu phiên lấy mẫu dựa trên một máy chủ trực tiếp với hàng trăm kết nối đồng thời đang gặp sự cố về hiệu suất và phát hiện các vấn đề xảy ra trong quá trình sản xuất mà tôi không bao giờ có thể tái tạo trong môi trường thử nghiệm.



1

Công cụ yêu thích của tôi là Easy Profiler: http://code.google.com/p/easyprofiler/

Đó là một trình biên dịch thời gian: mã nguồn phải được thiết kế thủ công bằng cách sử dụng một tập hợp các quy trình để mô tả các vùng đích. Tuy nhiên, khi ứng dụng được chạy và các phép đo được ghi tự động vào tệp XML, bạn chỉ cần mở ứng dụng Observer và thực hiện vài cú nhấp chuột trên các công cụ phân tích / so sánh, trước khi bạn có thể xem kết quả trong biểu đồ định tính.


1

Visual studio 2010 hồ sơ trong Windows. VTune có một công cụ đồ thị cuộc gọi tuyệt vời, nhưng nó đã bị hỏng kể từ Windows Vista / 7. Tôi không biết nếu họ sửa nó.


0

Hãy để tôi cung cấp một phích cắm cho EQATEC ... chính là thứ tôi đang tìm kiếm ... đơn giản để tìm hiểu và sử dụng và cung cấp cho tôi thông tin tôi cần để tìm các điểm phát một cách nhanh chóng. Tôi thích nó hơn cái được tích hợp trong Visual Studio (mặc dù tôi chưa thử VS 2010, công bằng mà nói).

Khả năng chụp ảnh nhanh là LỚN. Tôi thường nhận được một phân tích bổ sung và tối ưu hóa được thực hiện trong khi chờ đợi phân tích mục tiêu thực sự chạy ... thích nó.

Ồ, và phiên bản cơ sở của nó là miễn phí!
http://www.eqatec.com/Profiler/

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.