读书人

可执行程序 函数时间分析,该怎么处理

发布时间: 2012-02-17 17:50:42 作者: rapoo

可执行程序 函数时间分析
我们知道在linux里对c源程序可以编译连接后对可执行文件利用gprof分析内部函数的时间占用比例。
那么现在我们只有一个可执行文件,如何分析其内部的各个函数的占用时间(比例)?

[解决办法]
Intel有一个tool, 它叫 VTune(tm) Performance Analyzer。 它有windows and Linux 版本。
[解决办法]
一般情况下,你如果想要得到一个大概的情况, 在Linux里,你可以用strace 去看哪个函数调用的多少, 比如下面的列子,然后你在分析它的输出情况,可以大概知道哪个函数用的多少。

/home/pinghc/test> strace ./a.out
execve( "./a.out ", [ "./a.out "], [/* 31 vars */]) = 0
uname({sys= "Linux ", node= "hep.wisc.edu ", ...}) = 0
brk(0) = 0x633000
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x2a95556000
access( "/etc/ld.so.preload ", R_OK) = -1 ENOENT (No such file or directory)
open( "/etc/ld.so.cache ", O_RDONLY) = 3
fstat(3, {st_mode=S_IFREG|0644, st_size=107912, ...}) = 0
mmap(NULL, 107912, PROT_READ, MAP_PRIVATE, 3, 0) = 0x2a95557000
close(3) = 0
open( "/usr/lib64/libstdc++.so.6 ", O_RDONLY) = 3
read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0> \0\1\0\0\0\220\317 "..., 640) = 640
fstat(3, {st_mode=S_IFREG|0755, st_size=910520, ...}) = 0
mmap(0x3f4ff00000, 2030704, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x3f4ff00000
mprotect(0x3f4ffd6000, 1154160, PROT_NONE) = 0
mmap(0x3f500d5000, 36864, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0xd5000) = 0x3f500d5000
mmap(0x3f500de000, 72816, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x3f500de000
close(3) = 0
open( "/lib64/tls/libm.so.6 ", O_RDONLY) = 3
read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0> \0\1\0\0\0\360=0M? "..., 640) = 640
fstat(3, {st_mode=S_IFREG|0755, st_size=644472, ...}) = 0
mmap(0x3f4d300000, 1593800, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x3f4d300000
mprotect(0x3f4d385000, 1049032, PROT_NONE) = 0
mmap(0x3f4d484000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x84000) = 0x3f4d484000
close(3) = 0
open( "/lib64/libgcc_s.so.1 ", O_RDONLY) = 3
read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0> \0\1\0\0\0\300\34\320 "..., 640) = 640
fstat(3, {st_mode=S_IFREG|0755, st_size=47016, ...}) = 0
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x2a95572000
mmap(0x3f4fd00000, 1091424, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x3f4fd00000
mprotect(0x3f4fd0b000, 1046368, PROT_NONE) = 0
mmap(0x3f4fe0a000, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0xa000) = 0x3f4fe0a000
close(3) = 0
open( "/lib64/tls/libc.so.6 ", O_RDONLY) = 3
read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0> \0\1\0\0\0`\305\1M "..., 640) = 640
lseek(3, 624, SEEK_SET) = 624
read(3, "\4\0\0\0\20\0\0\0\1\0\0\0GNU\0\0\0\0\0\2\0\0\0\4\0\0\0 "..., 32) = 32
fstat(3, {st_mode=S_IFREG|0755, st_size=1617536, ...}) = 0
mmap(0x3f4d000000, 2305992, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x3f4d000000
mprotect(0x3f4d12a000, 1085384, PROT_NONE) = 0
mmap(0x3f4d229000, 24576, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x129000) = 0x3f4d229000
mmap(0x3f4d22f000, 16328, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x3f4d22f000
close(3) = 0
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x2a95573000
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x2a95574000


mprotect(0x3f4d229000, 16384, PROT_READ) = 0
mprotect(0x3f4d484000, 4096, PROT_READ) = 0
mprotect(0x3f4cf14000, 4096, PROT_READ) = 0
arch_prctl(ARCH_SET_FS, 0x2a955739c0) = 0
munmap(0x2a95557000, 107912) = 0
fstat(1, {st_mode=S_IFCHR|0620, st_rdev=makedev(136, 1), ...}) = 0
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x2a95557000
write(1, "0x501420\n ", 90x501420
) = 9
write(1, "the 999 bit is 128\n ", 19the 999 bit is 128
) = 19
write(1, "NOPQ bits are\n ", 14NOPQ bits are
) = 14
write(1, "01001110,01001111,01010000,01010 "..., 3601001110,01001111,01010000,01010001
) = 36
munmap(0x2a95557000, 4096) = 0
exit_group(0)
[解决办法]
IBM的rational suit套件中也有这样的性能分析工具,多的是了.

读书人网 >C语言

热点推荐