我正在調試一個C應用程序,我想知道它在一個特定函數中花了多少時間。在一個函數中測量時間C
我可以更改源代碼並添加更多代碼來執行測量,但對我來說這似乎不正確。我寧願用外部應用程序來做,而不是每次都重新編譯。
我發現有可能建立一個破發點中的GDB,所以我想,它必須能夠通過簡單的程序,使用類似的工具來跟蹤時間: - 設置斷點 - 停止時,測量實際時間和運行功能 - 離開功能時,重新測量時間 但是,我還沒有找到一種方法如何在gdb :(
任何想法做到這一點感謝
我正在調試一個C應用程序,我想知道它在一個特定函數中花了多少時間。在一個函數中測量時間C
我可以更改源代碼並添加更多代碼來執行測量,但對我來說這似乎不正確。我寧願用外部應用程序來做,而不是每次都重新編譯。
我發現有可能建立一個破發點中的GDB,所以我想,它必須能夠通過簡單的程序,使用類似的工具來跟蹤時間: - 設置斷點 - 停止時,測量實際時間和運行功能 - 離開功能時,重新測量時間 但是,我還沒有找到一種方法如何在gdb :(
任何想法做到這一點感謝
如果你使用GCC,你想要什麼?編譯選項「-pg」和應用程序gprof
。
分析可能是你想要的。看看prof或gprof。
UPDATE:以 「CC -Wall -ggdb -pg -g3 -02 diskhash.c -o diskhash」 compilng(運行程序), 「gprof的-p diskhash」 後給我:
Each sample counts as 0.01 seconds.
% cumulative self self total
time seconds seconds calls ms/call ms/call name
32.60 0.41 0.41 1 410.75 646.18 create_hashtab
31.80 0.81 0.40 5087692 0.00 0.00 hash_func
27.83 1.16 0.35 2543846 0.00 0.00 find_hash
2.78 1.20 0.04 2543846 0.00 0.00 chop_a_line
1.59 1.22 0.02 main
0.40 1.22 0.01 frame_dummy
0.00 1.22 0.00 4 0.00 0.00 map_da_file
gprof
只有可靠 - 根據我的經驗,僅適用於所有 - 如果您靜態鏈接每個庫(包括C庫)的編譯版本-pg
。您可以嘗試使用gcc的-profile
選項(這是做什麼-pg
不會做什麼加試圖在-pg
庫)但問題是,GNU libc真的不喜歡被靜態鏈接,並且您的發行版可能不會提供-pg
編譯版本你需要的每一個圖書館。
我建議你試試cachegrind
,這是操作的valgrind
模式,只需要對所有調試信息。這很容易得到。問題在於,它具有巨大的管理費用;如此之大以至於可能會使測試無效。預計至少會有2倍的放緩。
你也可以試試perf
- 如果你能得到一份副本。它非常聰明,但是對於內核黑客來說,他們認爲人們從零開始構建東西。我的運氣非常好。 (閱盡http://web.eecs.utk.edu/~vweaver1/projects/perf-events/這是關於底層API,而不是實用,但仍可能節省你的時間浪費很大。)
我有一個輔助功能在我的〜/ .gdbinit:
define timeme
set $last=clock()
n
set $timing=clock() - $last
if $timing>$arg0
printf "***long***\n"
end
printf "%d cycles, %f seconds\n", $timing, (float)$timing/1000000
end
您可能需要調整1000000,具體取決於您的平臺上CLOCKS_PER_SEC的實現情況。
用法很簡單;運行將執行下一個步驟,並給定時信息助手:
Breakpoint 2, install_new_payload_from_meta (snmp_meta=0x7eee81c0, pkt=0x0, entry=0x7d4f4e58) at /home/sgillibr/savvi-dc-snmp/recipies.c:187
(gdb) timeme 100000
***long***
580000 cycles, 0.580000 seconds
(gdb)
顯然分辨率可能是不夠的一些需求,雖然它被證明是非常有用的。
我試過它在C文件中的sleep()函數,它不工作,結果始終爲0。 – CodyChan
把這個放進你的〜/。當你要測量一個功能的時候gdbinit
define timeme
python import time
python starttime=time.time()
next
python print("Previous takes: " + (str)(time.time()-starttime) + "s")
end
document timeme
Measure executing time of next function
Usage: timeme or ti
end
型timeme
或ti
。
'gprof'會告訴我一個函數被調用了多少次,但不想讓我看看時間。它只是說「沒有時間積累」 –
然後也許它被優化了或什麼的。 –