提升精神业力真正的发电机性能

时间:2015-11-02 18:35:27

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

当我使用实数政策时,我对性能下降感到有些惊讶时,我正在检查提升精神业力生成器的性能。 住在Coliru
代码取自boost spirit,并添加了几个测试功能。 Coliru示例替换了使用的计时器。请注意,Coliru中止长时间运行的prog,因此它可能不会结束所有测试。
可以看出政策使用会降低性能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构建

1 个答案:

答案 0 :(得分:3)

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

第一个苹果/梨对

此处fixed是苹果,scientific是梨。

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

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

enter image description here

默认情况下,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

enter image description here

第二个苹果/梨对

出现这种情况时,您将精度固定为15位数。

通过使用另外两个策略的单独的头对头基准来实现精确度:http://paste.ubuntu.com/13087371/您可以看到这不仅仅是将格式修复为{{1}的好处。见上文:

scientific

或在图表中: Interactive Link

enter image description here