我正在制作新Spiral language的教程,并偶然发现了一个有趣的性能难题。我可以在this chapter中看到我想要做的事情,生成的两个程序包括:boxy和fully_specialized。他们正在做的只是从字符串中读取3个整数并将它们返回元组中。令人惊讶的是,boxy版本比完全专业版本快13倍(在某些运行中高达20倍)。脚本和编译模式的时序相似,因此在Repl。
中测试它应该很容易在尝试深入研究之前,为了试图解决这个问题,我有几点想法可能会发生这种情况。
1)由于代码占用空间较小,改进了缓存局部性。我认为不是这个,否则我会在不同的例子中看到类似的改进。
2)由JIT完成的黑魔法。
3)我对基准测试做错了。
据我所知,该程序似乎确实工作得很好,而且我的眼睛无法看到的是四四方方面的错误。
有关正在发生的事情的任何想法?
答案 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
中教程的解析章节。
从中得到的教训是 - 从不认真对待自己。我打算从这里把这个放在心上。