Perl6的性能会因为对十进制数使用有理数而受到影响吗



我知道Perl6尽可能将小数作为有理数来实现,以避免大多数其他语言中存在的浮点问题。

有人做过基准测试吗?或者了解这样做的性能损失吗?

使用十进制数的有理数会影响Perl6的性能吗

我认为最有用的总体答案是"不,不是真的,但让我详细说明一下"。

如果您不想关心准确性或性能

如果你想让P6自动保持小数计算的准确和快速,那么只需使用Rats。

如果计算涉及一个或多个P6Rats的表达式的总体结果的分母溢出64位,则P6将自动将结果切换到近似的Num(P6的双浮点实现)以保持合理的性能。

如果您想保证最高性能

您可以直接将浮点数据类型用于小数。

这会产生浮点性能,它通常比有理性能更快。

例如,3.141592e0不是有理/十进制文字,而是Num/浮点文字。

如果你想保证100%的准确性

如果使用一种内置的有理数据类型(有限精度Rat类、任意精度FatRat类或底层可参数化精度Rational角色),则如果计算符合分母,则对该数据的数字运算将100%准确。

阅读关于rational数据类型的维基百科页面,了解使用rational类型的性能影响。


是否有人进行过基准测试或了解这样做的性能损失?

Larry Wall做出的设计决策导致小数在默认情况下被处理为有理数。他已经讨论了#perl6的性能影响。一些有用的搜索:

  • 严重

  • "合理">

  • "浮动">

  • "分母">

如果我找到有用的基准测试的链接,我稍后会添加它们。

在当前版本的Perl6(Rakudo-Star 2017.07)中,我遇到的一个特定问题是,似乎存在将它们转换为字符串的性能问题。

我在调试一个脚本时注意到了这一点,该脚本使用CSV文件并以SVG格式输出图形,当然SVG格式有很多坐标。它很慢,当我开始分析它时,我发现我的脚本在src/core/RRational中花费了大量的时间。Str,并且所花费的时间与输出的数字数量不成比例(对于近11000只大鼠,接近6000ms)。在输出它们之前,只需使用Num方法将它们转换为浮点数,就可以显著提高速度(尽管这也会产生不同但相似的结果)。

我不知道这是一个普遍的问题,还是我的脚本特有的问题,这显然是一个可以修复的实现缺陷,但如果你输出了很多数字,在那之前需要注意。

相关内容

最新更新