前几天在实验室作了几个小实验,受益不浅,写代码却是其次,最重要的是渐渐了解了真实的 计算机科学 工做方式。html
不少工做均可以用 linux 下的工具高效完成,例如 要跑一组实验,其中有两个参数变更,那么就不须要手动运行屡次,只用一个 Shell Script 就能完成。配合 awk 效率更高。linux
其中两个工具真得很受用,一个是 GDB, 一个是 perf。前者用于程序调试,后者用于程序性能侦测。多线程
GDB 是linux下很出色的调试器, 不少经常使用的调试工具,例如 breakpoint, call stack 都有很好的实现。函数
对于 GDB, 推荐阅读这个 tutorial, 很是好,尤为是后面集成的针对 STL 的 pcontainer 方法。 工具
对于以前常常发生的段错误 SF, 以及常常出现的 core dump,都能用 GDB 准肯定位。只不过,在使用 g++ 编译的时候,要加上 -ggdb 参数,同时尽可能不要打开优化,不然编译器很难记录每一个符号。性能
perf 是内置在 linux 内核里的一个程序性能侦测工具。具体源码应该能够在 kernel 里找到。优化
以前使用一个图系统跑实验,发现多线程性能不佳,可是不能找到瓶颈,使用 perf 就能轻易看到,是 omp_barrier_wait_end,经过搜索能知道这个函数是 OpenMP 的同步方法,那么就能推断出问题出在 OpenMP 的任务分配上,不均衡的任务分配致使不均衡的计算时间。线程
perf 内置了多个工具,具体内容能够参看 man perf,其中最重要的两个是 report 和 record。调试
相似于 time 命令同样, 在程序前面加上 perf record, 能够生成一个报告,这个报告可以显示在程序这次运行里每一个函数占用的时间比,通常报告的后缀名都是 .perf.data 。htm
生成报告以后就用 perf report,这个工具可以分析 record 生成的报告,显示具体的函数占用时间排名。