我正在为新的Spiral language制作教程的过程中,偶然发现了一个有趣的性能难题。可以在this chapter中看到我正在尝试做的事情,生成的两个程序是:boxy和fully_specialized。他们所做的就是从一个字符串中读取3个整型数,并将它们返回到一个元组中。令人惊讶的是,boxy版本比完全专门化版本快13倍(在某些情况下高达20倍)。在脚本模式和编译模式下,计时是相似的,因此在Repl中测试它应该很容易。
在我尝试反汇编以试图弄清楚它之前,我有几个想法为什么会发生这种情况。
1)由于代码占用更少,提高了缓存的局部性。我不认为是这个,否则我会在另一个例子中看到类似的改进。
2)由JIT完成的黑魔法。
3)我在基准测试方面做错了什么。
据我所知,这个程序确实运行得很好,而且我的眼睛在方框版本中没有发现任何错误。
你知道是怎么回事吗?
发布于 2017-12-27 18:08:03
Method | Mean | Error | StdDev |
----------------- |-----------:|----------:|----------:|
TermCasted | 406.6 ns | 1.2316 ns | 1.1520 ns |
Boxy | 199.4 ns | 0.9976 ns | 0.9332 ns |
FullySpecialized | 292.8 ns | 0.8448 ns | 0.7902 ns |
FSharp | 3,616.2 ns | 8.9547 ns | 8.3762 ns |当我使用正确的benchmarking tool而不是随意的脚本时,我得到的数字是有意义的。boxy和完全专业化之间的差异是45%,而不是现在的1300%。这些数字更符合人们的预期。
螺旋的解析器比F#的解析器快一个数量级,这也是我们所期望的。查看教程的master解析器章节,了解更多信息。
从这件事中得到的教训是--千万不要自己做基准测试,真的。从这里开始,我打算把这件事放在心上。
https://stackoverflow.com/questions/47979396
复制相似问题