为什么解析器的四四方方的版本比完全专用的方式快13倍?

时间:2017-12-26 13:37:45

标签: f#

我正在制作新Spiral language的教程,并偶然发现了一个有趣的性能难题。我可以在this chapter中看到我想要做的事情,生成的两个程序包括:boxyfully_specialized。他们正在做的只是从字符串中读取3个整数并将它们返回元组中。令人惊讶的是,boxy版本比完全专业版本快13倍(在某些运行中高达20倍)。脚本和编译模式的时序相似,因此在Repl。

中测试它应该很容易

在尝试深入研究之前,为了试图解决这个问题,我有几点想法可能会发生这种情况。

1)由于代码占用空间较小,改进了缓存局部性。我认为不是这个,否则我会在不同的例子中看到类似的改进。

2)由JIT完成的黑魔法。

3)我对基准测试做错了。

据我所知,该程序似乎确实工作得很好,而且我的眼睛无法看到的是四四方方面的错误。

有关正在发生的事情的任何想法?

1 个答案:

答案 0 :(得分:1)

           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代替徒手脚本时,我会得到有意义的数字。四四方方和完全专业方面的区别是45%,现在不是1300%。这些数字更符合人们的期望。

Spiral的解析器也比F#快一个数量级,这也是预期的。有关详细信息,请查看master中教程的解析章节。

从中得到的教训是 - 从不认真对待自己。我打算从这里把这个放在心上。