工作者的表现要比主要表现差得多

时间:2014-04-24 07:20:42

标签: c++ multithreading performance benchmarking microbenchmark

我有一个小的测试程序,它与我的库一起编译,用于在使用不同的方法(SSE,for-loop,unrolled-loop,ect)时测试各种数学函数的速度。这些测试在不同的方法上运行了数十万次,并计算出所花费的计算时间的平均值。我决定为计算机的每个核心创建4个工作线程,并为我的测试运行基准测试。

现在这些都是微基准测试,以纳秒为单位测量,所以差异可能看起来很大,但实际上并没有其他类型的差异。

以下是我以单线程方式运行函数的代码:

static constexpr std::size_t num_tests = 400000;
auto do_test = [=](uint64_t(*test)()){
    // test is a function that returns nanosecods taken for a specific method
    uint64_t accum = 0;
    for(std::size_t n = 0; n < num_tests; n++)
        accum += test();
    return accum / num_tests;
};

这是我(更快)的代码,用于以多线程方式运行测试:

static constexpr std::size_t num_tests = 100000;
auto do_test = [=](uint64_t(*test)()){
    uint64_t accum = 0;

    std::thread first([&](){
        for(std::size_t n = 0; n < num_tests; n++)
            accum += test();
    });
    std::thread second([&](){
        for(std::size_t n = 0; n < num_tests; n++)
            accum += test();
    });
    std::thread third([&](){
        for(std::size_t n = 0; n < num_tests; n++)
            accum += test();
    });
    std::thread fourth([&](){
        for(std::size_t n = 0; n < num_tests; n++)
            accum += test();
    });

    first.join();
    second.join();
    third.join();
    fourth.join();

    return accum / (num_tests * 4);
};

但结果较慢D:因此执行速度较快,但操作结果较慢。

我的单线程版本平均为77纳秒,而我的多线程版本为操作提供了150纳秒的平均值!

为什么会这样?

P.S。我知道这是一个微不足道的差异,我只是觉得它很有趣。

0 个答案:

没有答案