Perl 6 性能是否会因对十进制数使用有理数而受到影响

Does Perl 6 performance suffer by using rationals for decimal numbers

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

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

Does Perl 6 performance suffer by using rationals for decimal numbers

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

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

如果您希望 P6 自动保持小数计算相当准确和快速,那么只需使用 Rats。

如果涉及一个或多个P6 Rat的表达式的总计算结果的分母溢出64位,则P6会自动将结果切换为近似Num (P6's implementation of a double float)以保持合理的性能.

如果你想保证最大性能

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

这产生的浮点性能通常比理性性能更快。

例如,3.141592e0 不是 rational/decimal 文字,而是 Num/float 文字。

如果你想保证100%准确

如果您使用一种内置的有理数据类型(有限精度 Rat class;任意精度 FatRat class; or the underlying parameterizable precision Rational role),那么对该数据的数值运算将为 100%如果计算符合分母,则准确。

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


Has anybody done benchmarking or have an understanding of the performance penalty of doing this?

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

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

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

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

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