我有一个小的测试程序,它与我的库一起编译,用于在使用不同的方法(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。我知道这是一个微不足道的差异,我只是觉得它很有趣。