【发布时间】:2017-10-20 00:42:20
【问题描述】:
我了解 Perl 6 尽可能将小数实现为有理数,以避免大多数其他语言中存在的浮点问题。
有没有人做过基准测试或了解这样做的性能损失?
【问题讨论】:
标签: raku
我了解 Perl 6 尽可能将小数实现为有理数,以避免大多数其他语言中存在的浮点问题。
有没有人做过基准测试或了解这样做的性能损失?
【问题讨论】:
标签: raku
对十进制数使用有理数会影响 Perl 6 的性能吗
我认为最有用的总体答案是“不,不是真的,但让我详细说明一下”。
如果您希望 P6 自动保持小数计算相当准确和快速,那么只需使用 Rats。
如果计算涉及一个或多个 P6 Rats 的表达式的整体结果的分母溢出 64 位,则 P6 将自动将结果切换为近似的 Num(P6 的 double float 实现)以保持合理的表现。
小数可以直接使用浮点数据类型。
这会产生浮点性能,通常比理性性能更快。
例如,3.141592e0 不是有理数/十进制文字,而是Num/float 文字。
如果您使用一种内置的有理数据类型(有限精度 Rat 类;任意精度 FatRat class;或底层可参数化精度 Rational role),那么对该数据的数值运算将 100% 准确如果计算符合分母。
阅读the wikipedia page on rational data types,了解使用有理类型对性能的影响。
有没有人做过基准测试或了解这样做的性能损失?
Larry Wall 做出的设计决定导致小数默认情况下被处理为有理数。他讨论了#perl6 的性能影响。一些有用的搜索:
如果我找到有用的基准的链接,我会稍后添加它们。
【讨论】:
我在当前版本的 Perl 6(Rakudo Star 2017.07)中遇到的一个具体问题是,似乎存在与将它们转换为字符串相关的性能问题。
我在调试脚本时注意到了这一点,该脚本采用 CSV 文件并以 SVG 格式输出图形,其中当然有很多坐标。它很慢,当我开始分析它时,我发现我的脚本在 src/core/Rational.Str 中花费了过多的时间,并且花费的时间与输出的数字数量不成比例(近 6000 毫秒几乎11000 只老鼠)。只需在输出它们之前立即使用 Num 方法将它们转换为浮点数即可显着提高速度(尽管这也产生了不同但相似的结果)。
我不知道这是一个普遍问题还是特定于我的脚本,这显然是一个可修复的实现缺陷,但如果你输出大量数字,在此之前需要注意一些事情。
【讨论】: