【问题标题】:Does Perl 6 performance suffer by using rationals for decimal numbersPerl 6 性能是否会因使用小数的有理数而受到影响
【发布时间】:2017-10-20 00:42:20
【问题描述】:

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

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

【问题讨论】:

    标签: raku


    【解决方案1】:

    对十进制数使用有理数会影响 Perl 6 的性能吗

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

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

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

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

    如果您想保证最大性能

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

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

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

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

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

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


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

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

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

    【讨论】:

    • 感谢您的详细回答 raiph
    • @RossAttrill 不客气。 thormick 的回答很有趣。我很好奇您在 P6 中使用有理数时是否遇到过他们的情况或任何其他病态减速?
    【解决方案2】:

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

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

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

    【讨论】:

      猜你喜欢
      • 2018-12-26
      • 2013-12-28
      • 2019-09-02
      • 2017-01-24
      • 1970-01-01
      • 2016-08-25
      • 1970-01-01
      • 2019-01-21
      • 1970-01-01
      相关资源
      最近更新 更多