当前位置: 首页 > 知识库问答 >
问题:

如何对Raku进行基准测试?

莫河
2023-03-14

我定期关注GitHub Rakudo存储库,查看Rakudo编译器发生了哪些变化。

我有时会看到提交,其中单个函数的速度提高了一定的百分比,时间如下图所示。

评估这一点的工作流是什么?我很想了解这一点,以便了解您的功能是如何执行的,并相应地进一步优化,从而为Rakudo的发展做出贡献。

我在这里阅读帮助。我谷歌了一下,但找不到此信息。我还通过命令行--profile选项了解了MoarVM分析器,它会生成html输出。要寻找什么?

我不是一个正式的计算机科学家。我理解托尼·霍尔(TonyHoare)的名言——“过早优化是万恶之源”,但随着时间的推移,一旦代码编写正确,人们就会希望对其进行优化。所以问题来了。

共有1个答案

高墨一
2023-03-14

我使用--profile来更好地了解瓶颈在哪里。生成的配置文件是一个很好的开始,但当差异变得非常小时,它不太适合CPU的使用。然而,它非常擅长跟踪对象的分配,并且更少的对象分配至少意味着更少的内存流失(但不总是如此,如果对象的寿命非常短)。使用--profile跟踪东西也会对优化产生影响,因此Heisenberg的不确定性原则肯定适用于此。

一旦我有了before/after的一段代码,我就可以将其作为脚本或带有时间的一行代码来运行。我有一堆方便的别名可以帮助我做到这一点:

alias r='time raku -e'
alias rp='raku --profile -e'

我之所以将其作为间隔至少几秒钟的单独进程来执行,是因为:

  1. 在此过程中运行多个基准测试往往会使CPU发热,然后会被降温,使后面的基准测试变得更糟。
  2. 如果两个基准测试在核心中共享一些代码,则后面的基准测试可能会受益于该代码已被早期基准测试内联/JITted。

然后我运行每个前后代码3到5次,并执行Nil循环以找出开销。所以例如:

$ r 'my $a = "42"; Int($a) for ^100000'
real    0m0.244s

$ r 'my $a = "42"; $a.Int for ^100000'
real    0m0.178s

$ r 'my $a = "42"; Nil for ^100000'
real    0m0.154s

然后计算差值:

$ r 'say (244 - 154) / (178 - 154)'
3.75

因此,使用$a.Int的速度大约是Int($a)的3.75倍。当然,这可能会启动另一个周期,找出为什么Int($a)要慢得多。此外,当我看到无法解释的速度差异时,我会使用一个配置文件来确定它是否真的在做我认为它在做的事情。特别是意外的常量折叠有时会让您认为您找到了最佳优化,而实际上您将代码简化为基本上什么都不做。

HTH公司

 类似资料:
  • 问题内容: 除了以下内容之外,是否有其他方法/软件可以给出执行用Swift编写的代码块所需的准确时间? 问题答案: 如果您只想为代码块提供独立的计时功能,则可以使用以下Swift助手功能: 前者将注销给定代码段所需的时间,后者将返回该时间作为浮点数。作为第一个变体的示例: 将注销类似: map()经过的时间:0.0617449879646301 s 请注意,Swift基准测试会根据您选择的优化级别

  • 问题内容: 对于大学,我进行字节码修改,并分析它们对Java程序性能的影响。因此,我需要Java程序(在生产中最好使用的Java程序)和适当的基准测试。例如,我已经有了HyperSQL,并通过基准程序PolePosition来衡量其性能。在没有JIT编译器的JVM上运行的Java程序。谢谢你的帮助! PS:我不能使用程序来对JVM或Java语言本身的性能进行基准测试(例如Wide Finder)。

  • 我想在内存使用效率方面比较Java程序的不同实现。有不同的使用场景被表述为JUnit测试用例。实际上,所有的代码都是开源的:https://github.com/headissue/cache2k-benchmark 获取Java程序已用内存的一般方法是:,当然也可以使用JMX接口来获取这些值。 但是,已使用内存的确定值不可靠。可能的原因: 可能有未收集的垃圾 有碎裂,如果GC没有压缩 到目前为止

  • 我有一个应用程序,我想使用对其进行基准测试。任何有关此集成的参考都将是有用的。

  • 我编写了一个非常简单的tornado处理程序,用于测试远程部署的一些设备的上传速度。主要测试将在所说的远程设备上运行(多亏了cURL),我可以得到上传时间的详细报告。 Tornado处理程序真正要做的唯一一件事就是接受一个包含大量字节的实体(差不多就是这样) 所以,上面的代码是有效的,但它有点。。。几乎是可耻的:-D让它更。。。可展示的,我想展示一些更有用的日志,比如请求上传所花的时间或者类似的东