d******e 发帖数: 117 | 1 我有一个软件的源代码,是用C写的。我想记录某些函数执行的时间,现在想的是在代
码里嵌入一些printf,把函数名和时间打印出来。困难在于这是一个multi-thread的软
件,需要避免冲突,而且如果嵌入的代码影响太大的话,会改变打印出来的时间的准确
性。有没有什么library/tool能帮我做这件事? |
d**o 发帖数: 864 | 2 profiling工具,你可以搜一下,哪个更适合你。
【在 d******e 的大作中提到】 : 我有一个软件的源代码,是用C写的。我想记录某些函数执行的时间,现在想的是在代 : 码里嵌入一些printf,把函数名和时间打印出来。困难在于这是一个multi-thread的软 : 件,需要避免冲突,而且如果嵌入的代码影响太大的话,会改变打印出来的时间的准确 : 性。有没有什么library/tool能帮我做这件事?
|
c*********e 发帖数: 16335 | 3 #include
struct timespec requestStart,requestEnd;
clock_gettime(CLOCK_REALTIME,&requestStart);
...
clock_gettime(CLOCK_REALTIME,&requestEnd);
double elapsedTime = (requestEnd.tv_sec - requestStart.tv_sec ) * 1E9 + (
requestEnd.tv_nsec - requestStart.tv_nsec);
【在 d******e 的大作中提到】 : 我有一个软件的源代码,是用C写的。我想记录某些函数执行的时间,现在想的是在代 : 码里嵌入一些printf,把函数名和时间打印出来。困难在于这是一个multi-thread的软 : 件,需要避免冲突,而且如果嵌入的代码影响太大的话,会改变打印出来的时间的准确 : 性。有没有什么library/tool能帮我做这件事?
|
h**********c 发帖数: 4120 | 4 If I was given this assignment, perhaps probably may I will put the time
stamps, clock ticks in a queue, printf them before the the program exit, if
the program finishes at last and least. |
d******e 发帖数: 117 | 5 多谢回复。
还有两个问题要解决:
怎样存elapsedTime,怎样输出。为了不影响runtime性能,可能需要缓存输出。对于
multi-thread的程序,缓存可能要用lock。这还是有一点复杂度。
【在 c*********e 的大作中提到】 : #include : struct timespec requestStart,requestEnd; : clock_gettime(CLOCK_REALTIME,&requestStart); : ... : clock_gettime(CLOCK_REALTIME,&requestEnd); : double elapsedTime = (requestEnd.tv_sec - requestStart.tv_sec ) * 1E9 + ( : requestEnd.tv_nsec - requestStart.tv_nsec);
|
h**********c 发帖数: 4120 | 6 Let's say multi-thread. In java, LinkedConcurrentQueue can be very fast.
While you use C++. Otherwise, you can spend sometime study the source code
of log4j. It is regretful log4j is for java.
So I mentor you an architecture. For each thread you declare a local storage
, say a c++ hashmap , may not be exactly accurate. Most c++
thread can be joined. Before you join them, you can check a boolean
variable (or use semaphores), advanced Unix programming has similar example.
You don't look like a beginner. So each thread can notify the main thread,
after it finishes its task. Remember multi-threading , it often happens that
a thread does not finish. But assume all you threads are correct. The main
thread will merge all the stamp maps. At least, you don't use lock for the
stamp/clock_t queues. At last, print/analyse your stamps.
I don't comment non-technical stuff. You can profile multi-threading. But it
is very difficult to DEBUG.
good luck. |
b***i 发帖数: 3043 | 7 如果每个thread自己拥有一个queue,不就解决了,不用lock。thread结束的时候通知主
程序,这个时候所有性能相关的已经全部结束。
【在 d******e 的大作中提到】 : 多谢回复。 : 还有两个问题要解决: : 怎样存elapsedTime,怎样输出。为了不影响runtime性能,可能需要缓存输出。对于 : multi-thread的程序,缓存可能要用lock。这还是有一点复杂度。
|
c*******y 发帖数: 1630 | 8 这个比较麻烦,写一个class。
ctor里面调用一次clock,或者time
dtor里面再调用一次,print diff出来。
每次在函数体的开头定义一个实例就可以了。
【在 c*********e 的大作中提到】 : #include : struct timespec requestStart,requestEnd; : clock_gettime(CLOCK_REALTIME,&requestStart); : ... : clock_gettime(CLOCK_REALTIME,&requestEnd); : double elapsedTime = (requestEnd.tv_sec - requestStart.tv_sec ) * 1E9 + ( : requestEnd.tv_nsec - requestStart.tv_nsec);
|
c*******y 发帖数: 1630 | 9 V-tune,这是我用过的profiler里面最好的,其他的perf等link到了debug库,还是找
不到caller function。
non-commercial免费。
【在 d******e 的大作中提到】 : 我有一个软件的源代码,是用C写的。我想记录某些函数执行的时间,现在想的是在代 : 码里嵌入一些printf,把函数名和时间打印出来。困难在于这是一个multi-thread的软 : 件,需要避免冲突,而且如果嵌入的代码影响太大的话,会改变打印出来的时间的准确 : 性。有没有什么library/tool能帮我做这件事?
|
d*******o 发帖数: 5897 | 10 这个方法测的是wall clock吧?函数被suspend的时间也被算进去了,不是函数实打实
消耗的cpu时间。
【在 c*********e 的大作中提到】 : #include : struct timespec requestStart,requestEnd; : clock_gettime(CLOCK_REALTIME,&requestStart); : ... : clock_gettime(CLOCK_REALTIME,&requestEnd); : double elapsedTime = (requestEnd.tv_sec - requestStart.tv_sec ) * 1E9 + ( : requestEnd.tv_nsec - requestStart.tv_nsec);
|