自更新到gcc 4.9.2以来std :: chrono测量错误

时间:2014-11-17 10:40:54

标签: c++ gcc chrono

我正在使用以下内容来计算我的单元测试时间:

template<typename F>
void TestFunc(F lambda)
{
    std::array<std::chrono::milliseconds::rep, 20> time;

    for (int i = 0; i < 10; ++i) {
        auto t1 = std::chrono::high_resolution_clock::now();

        for (int j = 0; j < 1000; ++j) {
            lambda();
        }

        auto t2 = std::chrono::high_resolution_clock::now();

        time[i] = std::chrono::duration_cast<std::chrono::milliseconds>(t2 - t1).count();
    }

    size_t avg = std::accumulate(begin(time), end(time), (std::chrono::milliseconds::rep)0) / time.size();

   ...
}

但是我在ubuntu + gcc 4.9.2上遇到了损坏的结果。像21006482932417这样的值,其中gcc 4.8和VS2013返回4 ms

在将gcc从4.8.x更新到4.9.2之前,测量结果是正确的。可能是因为使用了不正确的libstd版本?我跑ldd检查

> ldd ./bin/unittest
    linux-vdso.so.1 =>  (0x00007fff039fe000)
    libboost_chrono.so.1.57.0 => /usr/local/lib/libboost_chrono.so.1.57.0 (0x00007fde053c2000)
    libboost_system.so.1.57.0 => /usr/local/lib/libboost_system.so.1.57.0 (0x00007fde051bd000)
    libboost_filesystem.so.1.57.0 => /usr/local/lib/libboost_filesystem.so.1.57.0 (0x00007fde04fa6000)
    libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007fde04d7c000)
    libstdc++.so.6 => /usr/lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007fde04a6f000)
    libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007fde04858000)
    libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fde04492000)
    librt.so.1 => /lib/x86_64-linux-gnu/librt.so.1 (0x00007fde04289000)
    /lib64/ld-linux-x86-64.so.2 (0x00007fde057f7000)
    libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007fde03f83000)

还尝试切换到boost :: chrono,但它也没有帮助。可能的原因是什么?

1 个答案:

答案 0 :(得分:1)

您正在分配一个包含20个项目的数组,但只为前10个项目分配值,因此其余项目都是单元化的。即使它们被初始化为0,它们也会甩掉平均值。你可能会做这样的事情,你传递测试的次数,这样尺寸就不会失去同步。

#include <algorithm>
#include <array>
#include <chrono>
#include <functional>
#include <iostream>
#include <numeric>
#include <vector>

template <size_t N, typename F>
void TestFunc(F lambda)
{
    std::array<std::chrono::milliseconds::rep, N> time;

    for(int i = 0; i < N; ++i)
    {
        auto t1 = std::chrono::high_resolution_clock::now();
        for(int j = 0; j < 1000; ++j)
        {
            lambda();
        }
        auto t2 = std::chrono::high_resolution_clock::now();
        time[i] = std::chrono::duration_cast<std::chrono::milliseconds>(t2 - t1).count();
    }
    auto avg = std::accumulate(begin(time), end(time), (std::chrono::milliseconds::rep)0) / time.size();
    std::cout << "Average of " << N << " tests is " << avg << "ms.\n";
}

int main()
{
    std::function<int()> f = []()
    {
        int sum = 0; for(int i = 0; i < 100000; ++i) sum += i; return sum;
    };
    TestFunc<10>(f);
    return 0;
}

我没有gcc 4.9.2方便测试,但这在Visual Studio 2013和ideone上运行良好。