我正在做一个项目(编程语言),我开始做一些分析。当我运行阶乘测试时,得到以下结果:
burton@smokey:~/repl$ time tests/fact.repl
real 0m4.451s
user 0m1.820s
sys 0m2.620s
我的问题是系统时间。除了读取输入文件外,我没有执行任何系统调用(没有输出)。这应该是一个几乎完全受用户时间限制的应用程序。我试着运行strace -c,看看是否有任何错误的系统调用占用了大量的时间,但没有发现任何东西。Gprof也没有给我任何答案。
有没有其他的工具来找出是什么在我的应用程序中占用了这么多的系统时间?我只是被时间命令欺骗了吗?当我运行sbcl做同样的计算时,sys时间大约是0.03秒,这是我所希望的。
下面是strace -c的完整输出:burton@smokey:~/repl$ strace -c tests/fact.repl
% time seconds usecs/call calls errors syscall
------ ----------- ----------- --------- --------- ----------------
-nan 0.000000 0 2 read
-nan 0.000000 0 3 open
-nan 0.000000 0 2 close
-nan 0.000000 0 3 fstat
-nan 0.000000 0 12 mmap
-nan 0.000000 0 4 mprotect
-nan 0.000000 0 1 munmap
-nan 0.000000 0 16 brk
-nan 0.000000 0 2 rt_sigaction
-nan 0.000000 0 4 rt_sigprocmask
-nan 0.000000 0 1 1 ioctl
-nan 0.000000 0 3 3 access
-nan 0.000000 0 1 execve
-nan 0.000000 0 1 arch_prctl
-nan 0.000000 0 2 setrlimit
------ ----------- ----------- --------- --------- ----------------
100.00 0.000000 57 4 total
在内存中分配和分页所花费的时间算作系统时间。试试/usr/bin/time tests/fact.repl
——它显示了页面错误的数量。
顺便说一下,"除了读取输入文件外,我没有做任何系统调用"one_answers"我正在分配内存"是相互矛盾的陈述。
我没有做任何系统调用
考虑到time
打印的内容,这似乎不太可能。
首先,在strace -c
下运行程序。这将告诉您执行了多少系统调用,以及其中哪些调用花费了最多时间。
一旦你知道了"有趣的"系统调用,你就可以通过strace -tt -T -e trace=<interesting syscall>
获得更多的细节。查看strace手册页获取更多信息。
既然strace -c
显示(有效地)0时间,也许你是分支子进程或创建线程?在这种情况下,strace -f
可能会给出有趣的输出。
我没有任何线索,但你的程序使用几个线程和Posix同步原语(例如pthread_mutex_lock
等…)?因为这些原语是建立在一些系统调用(futex调用)之上的。