Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/fsharp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
F# 为什么方形版本的解析器比完全专用的解析器快13倍?_F# - Fatal编程技术网

F# 为什么方形版本的解析器比完全专用的解析器快13倍?

F# 为什么方形版本的解析器比完全专用的解析器快13倍?,f#,F#,我正在为新版本制作教程,偶然发现了一个有趣的性能难题。我想做的事情可以在中看到,生成的两个程序是:和。他们所做的只是从一个字符串中读取3个整数,然后以元组的形式返回它们。令人惊讶的是,方形版本比完全专业化的版本快13倍(在某些情况下甚至高达20倍)。在脚本模式和编译模式下,计时是相似的,因此在Repl中测试它应该很容易 在我尝试深入分解以试图弄清楚它之前,我有几个想法为什么会发生这种情况 1) 由于较小的代码占用空间,改进了缓存位置。我不认为这是一个,否则我会看到类似的改善在另一个例子 2) 由

我正在为新版本制作教程,偶然发现了一个有趣的性能难题。我想做的事情可以在中看到,生成的两个程序是:和。他们所做的只是从一个字符串中读取3个整数,然后以元组的形式返回它们。令人惊讶的是,方形版本比完全专业化的版本快13倍(在某些情况下甚至高达20倍)。在脚本模式和编译模式下,计时是相似的,因此在Repl中测试它应该很容易

在我尝试深入分解以试图弄清楚它之前,我有几个想法为什么会发生这种情况

1) 由于较小的代码占用空间,改进了缓存位置。我不认为这是一个,否则我会看到类似的改善在另一个例子

2) 由JIT完成的黑魔法

3) 我在基准测试方面犯了一些错误

据我所知,这个程序确实运行得很好,而且我的眼睛所能看到的任何东西在这个方形的版本中都没有问题

你知道发生了什么事吗

           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#的优化器有关,这使得它运行得更快?这些程序实际上是有效的。