通过使用十进制数的有理数,Perl 6的性能是否会受到影响

时间:2017-10-20 00:42:20

标签: perl6

我理解Perl 6会尽可能地将小数作为有理数实现,以避免大多数其他语言中出现的浮点问题。

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

2 个答案:

答案 0 :(得分:6)

  

使用十进制数的有理数

是否会影响Perl 6的性能

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

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

如果您希望P6只是自动保持十进制计算的合理准确和快速,那么只需使用Rat s。

如果计算涉及一个或多个P6 Rat s的表达式的整体结果的分母溢出64位,那么P6将自动将结果切换为近似Num(P6' s实现double float)以保持合理的表现。

如果您想保证最高性能

您可以直接使用浮点数据类型作为小数。

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

例如,3.141592e0不是理性/十进制文字,而是Num / float文字。

如果您想保证100%准确度

如果您使用其中一种内置有理数据类型(有限精度Rat类;任意精度FatRat class;或基础可参数化精度Rational role),那么对其进行数值运算如果计算符合分母,则数据将100%准确。

阅读the wikipedia page on rational data types,了解使用理性类型的性能影响的起点。

  

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

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

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

答案 1 :(得分:3)

我在当前版本的Perl 6(Rakudo Star 2017.07)中遇到的一个具体问题是,似乎存在与将它们转换为字符串相关的性能问题。

我在调试一个带有CSV文件并输出SVG格式的图形的脚本时注意到了这一点,当然这个图形有很多坐标。它很慢,当我开始分析它时,我看到我的脚本在src / core / Rational.Str中花费了过多的时间,并且花费的时间与输出的数字的数量不成比例(近6000毫秒) 11000只大鼠)。在输出它们之前立即使用Num方法将它们转换为浮点数会导致显着的加速(尽管这也给出了不同但相似的结果)。

我不知道这是一个普遍问题还是特定于我的脚本,它显然是一个可修复的实现缺点,但是如果输出大量数字,那么要注意的事情。