F# 为什么方形版本的解析器比完全专用的解析器快13倍?
我正在为新版本制作教程,偶然发现了一个有趣的性能难题。我想做的事情可以在中看到,生成的两个程序是:和。他们所做的只是从一个字符串中读取3个整数,然后以元组的形式返回它们。令人惊讶的是,方形版本比完全专业化的版本快13倍(在某些情况下甚至高达20倍)。在脚本模式和编译模式下,计时是相似的,因此在Repl中测试它应该很容易 在我尝试深入分解以试图弄清楚它之前,我有几个想法为什么会发生这种情况 1) 由于较小的代码占用空间,改进了缓存位置。我不认为这是一个,否则我会看到类似的改善在另一个例子 2) 由JIT完成的黑魔法 3) 我在基准测试方面犯了一些错误 据我所知,这个程序确实运行得很好,而且我的眼睛所能看到的任何东西在这个方形的版本中都没有问题 你知道发生了什么事吗F# 为什么方形版本的解析器比完全专用的解析器快13倍?,f#,F#,我正在为新版本制作教程,偶然发现了一个有趣的性能难题。我想做的事情可以在中看到,生成的两个程序是:和。他们所做的只是从一个字符串中读取3个整数,然后以元组的形式返回它们。令人惊讶的是,方形版本比完全专业化的版本快13倍(在某些情况下甚至高达20倍)。在脚本模式和编译模式下,计时是相似的,因此在Repl中测试它应该很容易 在我尝试深入分解以试图弄清楚它之前,我有几个想法为什么会发生这种情况 1) 由于较小的代码占用空间,改进了缓存位置。我不认为这是一个,否则我会看到类似的改善在另一个例子 2) 由
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 |
当我使用一个合适的脚本而不是一个即兴的脚本时,我得到的数字是有意义的。方形和完全专业化之间的差异是45%,而不是现在的1300%。这些数字更符合人们的预期
螺旋式解析器的大小也比F的快,这也是我们所期望的。有关更多信息,请查看中教程的解析章节
从中得到的教训是——严肃地说,永远不要以自己为基准。我打算从这里牢记这一点。不太可能有人会花时间破译您生成的代码。我建议你把这两个例子都减少到最小的重复形式。作为奖励,当你这样做的时候,你可能会发现差异的原因。我会接受你的建议。我想如果我把这个贴出来,我可能会想到一些事情。通常当它是这样的时候,我会错过一些愚蠢的事情,但我现在没有这种感觉,所以我想知道它是否可能与F#的优化器有关,这使得它运行得更快?这些程序实际上是有效的。