可能是一个愚蠢的问题,因为awk命令通常非常紧凑,只需执行一两个操作...配置awk命令?
有没有办法配置和awk命令?即。如果它使用gsub,split,排序关联数组,有没有一种简单的方法来找出哪个部分陷入整个操作?
编辑:具体而言,我正在寻找执行时间为每个子命令,而不是多少次被称为。这可能吗?
可能是一个愚蠢的问题,因为awk命令通常非常紧凑,只需执行一两个操作...配置awk命令?
有没有办法配置和awk命令?即。如果它使用gsub,split,排序关联数组,有没有一种简单的方法来找出哪个部分陷入整个操作?
编辑:具体而言,我正在寻找执行时间为每个子命令,而不是多少次被称为。这可能吗?
几乎完美。现在如何判断在每个命令上花了多少时间? – lonestar21 2012-03-30 18:17:57
在这种情况下,请使用upvote按钮。无论如何:你可以随时打印系统时间(打印出EPOCH的秒数),你也可以用它来做一些数学运算...... – 2012-03-30 18:21:51
这个功能看起来更像是覆盖测试,告诉你哪些线路已被击中很多次,这当然是有用的,但它不是剖析 – Kaz 2012-03-30 23:56:45
从GAWK手册页:
pgawk是GAWK的分析版本。除了程序运行速度更慢之外, 与gawk完全相同,并且在完成时它会自动在文件awkprof.out中生成执行配置文件 。请参阅下面的--profile选项 。
所以如果你使用的是GNU实现,答案是肯定的。
而对于福斯代尔的下一个问题,该名男子页接着说
dgawk是一个awk调试器。它不是直接运行程序,而是 加载AWK源代码,然后提示输入调试命令。 与gawk和pgawk不同,dgawk只处理带有-f选项的 的AWK程序源。调试器记录在GAWK中:有效的AWK 编程。
有一个awk实现a debugger similar to gdb, called dgawk。
你说你想要执行每个子命令的时间。 不管语言如何,我都可以这样做:
给它足够的工作量,足够长的运行时间,并用手表计时(N秒)。 然后再次运行,并在运行时按Ctrl-C。 做回溯检查堆栈,并将其复制到文本编辑器中。 做了几次,就像10.
任何子命令都会出现在堆栈上,花费的时间很少。 所以如果sort
占用了50%的时间(N/2秒),它会出现在大约5个样本上。
这告诉你关于大接手的事情,而不是小事。我假设你正在寻找大的。
(有人说这是不准确的,这是胡说八道,确保时间的长短不是很准确 - 它不是必须的,你需要的精确度是在位置 - 找出问题出在哪里,这就是它的作用。)
增加:你可以差不多做这个pgawk。如果您在分析模式下运行程序,则每次按Ctrl-C(或其他)时,都会将调用堆栈输出到输出文件。唯一的问题是,它会打印函数名称,而不是打印它们被调用的行,而这些行可能实际需要。
为gprof构建gawk的性能分析版本,或者使用基于内核的oprofile。然后,您可以详细了解在gawk中响应脚本及其数据的各种内部函数花费了多少时间。像gsub
和split
这样的函数映射到gawk
中的函数。
例如gsub
等功能由do_sub
功能在这个源文件处理:
http://git.savannah.gnu.org/cgit/gawk.git/tree/builtin.c
所以你能看到多少时间在do_sub
花费。
你想编译链接gawk与-pg
GCC选项。然后该程序的成功运行将转储一个配置文件gmon.out
,其中gprof
将生成报告。
我强烈推荐oprofile也,但进入这个答案的范围很小。
这绝对是最接近的东西你可以给出一个更彻底的例子,在实践中做这个或者链接到一个吗?如果我正确地理解了你,你建议从关于解释器的信息推断关于代码的分析信息。世界上最直观的东西。 – Stephenr 2015-02-14 22:01:35
嗯......增加总时间到分析可能是一个合理的规模贡献gawk。 – dmckee 2012-03-30 18:33:27