2012-03-30 122 views
1

可能是一个愚蠢的问题,因为awk命令通常非常紧凑,只需执行一两个操作...配置awk命令?

有没有办法配置和awk命令?即。如果它使用gsub,split,排序关联数组,有没有一种简单的方法来找出哪个部分陷入整个操作?

编辑:具体而言,我正在寻找执行时间为每个子命令,而不是多少次被称为。这可能吗?

+0

嗯......增加总时间到分析可能是一个合理的规模贡献gawk。 – dmckee 2012-03-30 18:33:27

回答

1
+0

几乎完美。现在如何判断在每个命令上花了多少时间? – lonestar21 2012-03-30 18:17:57

+0

在这种情况下,请使用upvote按钮。无论如何:你可以随时打印系统时间(打印出EPOCH的秒数),你也可以用它来做一些数学运算...... – 2012-03-30 18:21:51

+0

这个功能看起来更像是覆盖测试,告诉你哪些线路已被击中很多次,这当然是有用的,但它不是剖析 – Kaz 2012-03-30 23:56:45

2

从GAWK手册页:

pgawk是GAWK的分析版本。除了程序运行速度更慢之外, 与gawk完全相同,并且在完成时它会自动在文件awkprof.out中生成执行配置文件 。请参阅下面的--profile选项 。

所以如果你使用的是GNU实现,答案是肯定的。

而对于福斯代尔的下一个问题,该名男子页接着说

dgawk是一个awk调试器。它不是直接运行程序,而是 加载AWK源代码,然后提示输入调试命令。 与gawk和pgawk不同,dgawk只处理带有-f选项的 的AWK程序源。调试器记录在GAWK中:有效的AWK 编程。

2

有一个awk实现a debugger similar to gdb, called dgawk

你说你想要执行每个子命令的时间。 不管语言如何,我都可以这样做:

给它足够的工作量,足够长的运行时间,并用手表计时(N秒)。 然后再次运行,并在运行时按Ctrl-C。 做回溯检查堆栈,并将其复制到文本编辑器中。 做了几次,就像10.

任何子命令都会出现在堆栈上,花费的时间很少。 所以如果sort占用了50%的时间(N/2秒),它会出现在大约5个样本上。

这告诉你关于大接手的事情,而不是小事。我假设你正在寻找大的。

(有人说这是不准确的,这是胡说八道,确保时间的长短不是很准确 - 它不是必须的,你需要的精确度是在位置 - 找出问题出在哪里,这就是它的作用。)

增加:你可以差不多做这个pgawk。如果您在分析模式下运行程序,则每次按Ctrl-C(或其他)时,都会将调用堆栈输出到输出文件。唯一的问题是,它会打印函数名称,而不是打印它们被调用的行,而这些行可能实际需要。

1

为gprof构建gawk的性能分析版本,或者使用基于内核的oprofile。然后,您可以详细了解在gawk中响应脚本及其数据的各种内部函数花费了多少时间。像gsubsplit这样的函数映射到gawk中的函数。

例如gsub等功能由do_sub功能在这个源文件处理:

http://git.savannah.gnu.org/cgit/gawk.git/tree/builtin.c

所以你能看到多少时间在do_sub花费。

你想编译链接gawk与-pg GCC选项。然后该程序的成功运行将转储一个配置文件gmon.out,其中gprof将生成报告。

我强烈推荐oprofile也,但进入这个答案的范围很小。

+0

这绝对是最接近的东西你可以给出一个更彻底的例子,在实践中做这个或者链接到一个吗?如果我正确地理解了你,你建议从关于解释器的信息推断关于代码的分析信息。世界上最直观的东西。 – Stephenr 2015-02-14 22:01:35