我理解Perl 6会尽可能地将小数作为有理数实现,以避免大多数其他语言中出现的浮点问题。
有没有人做过基准测试或了解这样做的性能损失?
答案 0 :(得分:6)
使用十进制数的有理数
是否会影响Perl 6的性能
我认为最有用的总体答案是"不,不是真的,但让我详细说明一下"。
如果您希望P6只是自动保持十进制计算的合理准确和快速,那么只需使用Rat
s。
如果计算涉及一个或多个P6 Rat
s的表达式的整体结果的分母溢出64位,那么P6将自动将结果切换为近似Num
(P6' s实现double float)以保持合理的表现。
您可以直接使用浮点数据类型作为小数。
这会产生浮点性能,通常比合理性能更快。
例如,3.141592e0
不是理性/十进制文字,而是Num
/ float文字。
如果您使用其中一种内置有理数据类型(有限精度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方法将它们转换为浮点数会导致显着的加速(尽管这也给出了不同但相似的结果)。
我不知道这是一个普遍问题还是特定于我的脚本,它显然是一个可修复的实现缺点,但是如果输出大量数字,那么要注意的事情。