【问题标题】:boost spirit karma real generator performance提升精神业力真实发电机性能
【发布时间】:2015-11-02 18:35:26
【问题描述】:

当我对使用实数策略时性能下降感到有些惊讶时,我正在检查提升精神业力生成器的性能。 直播Coliru
代码取自boost spirit,并添加了几个测试函数。 Coliru 示例替换了使用的计时器。请注意,Coliru 会中止长时间运行的程序,因此它可能不会结束所有测试。
正如我们所看到的,策略使用会降低性能 2-3(coliru 上的 x10)倍。这是预期的行为吗?

我的数字:

sprintf:0.367
iostreams:0.818
格式:1.036
业力:0.087
(字符串):0.152
业力(字符串)与 政策:0.396
业力(规则):0.12
业力(直接):0.083
业力 (直接)字符串:0.089
具有策略的业力(直接)字符串:0.278


使用 x64 VC14 构建

【问题讨论】:

标签: c++ visual-c++ boost boost-spirit boost-spirit-karma


【解决方案1】:

如果你比较苹果和梨,这不是回归。在这种情况下,两次。

第一对苹果/梨

这里fixed 是苹果,scientific 是梨。

不仅得到的输出明显不同,而且得到结果需要不同的步骤。

重要的是,scientific 涉及获取输入值的log10,以便确定小数点前以 10 位为基数的数字的大小:

默认情况下,real_policies 调用“便宜”的判决:

    static int floatfield(T n)
    {
        if (traits::test_zero(n))
            return fmtflags::fixed;

        T abs_n = traits::get_absolute_value(n);
        return (abs_n >= 1e5 || abs_n < 1e-3) 
          ? fmtflags::scientific : fmtflags::fixed;
    }

因此,如果您选择一种无论如何都会切换到科学格式的格式,您可以看到差异消失:123456.123456 而不是 12345.12345...:

clock resolution: mean is 16.9199 ns (40960002 iterations)

benchmarking format_performance_direct_string
collecting 100 samples, 1 iterations each, in estimated 4.7784 ms
mean: 238.81 ns, lb 187.22 ns, ub 493.46 ns, ci 0.95
std dev: 507.559 ns, lb 5.36317 ns, ub 1111.94 ns, ci 0.95
found 11 outliers among 100 samples (11%)
variance is severely inflated by outliers

benchmarking format_performance_direct_string_with_policy
collecting 100 samples, 96 iterations each, in estimated 1699.2 μs
mean: 173.927 ns, lb 172.764 ns, ub 176.939 ns, ci 0.95
std dev: 8.33706 ns, lb 0.256875 ns, ub 16.9312 ns, ci 0.95
found 2 outliers among 100 samples (2%)
variance is moderately inflated by outliers

benchmarking format_performance_string
collecting 100 samples, 84 iterations each, in estimated 1705.2 μs
mean: 312.646 ns, lb 311.027 ns, ub 314.819 ns, ci 0.95
std dev: 9.42479 ns, lb 7.32668 ns, ub 15.2546 ns, ci 0.95
found 1 outliers among 100 samples (1%)
variance is moderately inflated by outliers

benchmarking format_performance_string_with_policy
collecting 100 samples, 31 iterations each, in estimated 1736 μs
mean: 193.572 ns, lb 192.257 ns, ub 200.032 ns, ci 0.95
std dev: 12.8586 ns, lb 0.322008 ns, ub 30.6708 ns, ci 0.95
found 4 outliers among 100 samples (4%)
variance is severely inflated by outliers

如您所见,自定义策略(可预测)快得多

作为Interactive Link

第二对苹果/梨

这会出现在您将精度固定为 15 位的地方。

通过使用两个策略的单独的头对头基准测试,这两个策略实际上会增加精确度:http://paste.ubuntu.com/13087371/,您可以看到这不仅失去了将格式固定为scientific 的好处,还可以看到上面的:

clock resolution: mean is 18.6041 ns (40960002 iterations)

benchmarking format_performance_direct_string_with_policy
collecting 100 samples, 1 iterations each, in estimated 1892.9 μs
mean: 228.83 ns, lb 179.9 ns, ub 471.84 ns, ci 0.95
std dev: 483.67 ns, lb 2.29965 ns, ub 1153.98 ns, ci 0.95
found 14 outliers among 100 samples (14%)
variance is severely inflated by outliers

benchmarking format_performance_direct_string_with_policy15
collecting 100 samples, 45 iterations each, in estimated 1858.5 μs
mean: 418.697 ns, lb 410.976 ns, ub 438.865 ns, ci 0.95
std dev: 58.0984 ns, lb 24.1313 ns, ub 115.549 ns, ci 0.95
found 6 outliers among 100 samples (6%)
variance is severely inflated by outliers

benchmarking format_performance_string_with_policy
collecting 100 samples, 87 iterations each, in estimated 1870.5 μs
mean: 262.057 ns, lb 254.73 ns, ub 269.354 ns, ci 0.95
std dev: 37.2502 ns, lb 31.1261 ns, ub 50.5813 ns, ci 0.95
found 17 outliers among 100 samples (17%)
variance is severely inflated by outliers

benchmarking format_performance_string_with_policy15
collecting 100 samples, 42 iterations each, in estimated 1898.4 μs
mean: 458.505 ns, lb 453.626 ns, ub 481.044 ns, ci 0.95
std dev: 45.5401 ns, lb 4.30147 ns, ub 108.045 ns, ci 0.95
found 4 outliers among 100 samples (4%)
variance is severely inflated by outliers

或在图中:Interactive Link

【讨论】:

  • 资源:All-in-all benchmark results (textual),使用的代码:gist。请参阅excellent Nonius framework。录制的直播part #1part #2 (experiment)
  • 非常感谢您的努力!奇怪的是,我也使用了固定策略,不知何故我记得它非常接近科学,只是现在重新检查它,它不是(如预期的那样)。特别感谢 Nonius,这正是我所需要的!并感谢视频,稍后会观看我的部分,它很长。特别感谢海顿 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多