我在对一个函数进行基准测试时,发现某些迭代比其他迭代慢。
经过一些测试后,我尝试对两个连续的测量进行基准测试,但仍然得到一些奇怪的结果。
代码在wandbox上。
对我来说重要的是:
using clock = std::chrono::steady_clock;
// ...
for (int i = 0; i < statSize; i++)
{
auto t1 = clock::now();
auto t2 = clock::now();
}
Run Code Online (Sandbox Code Playgroud)
正如我们在Godbolt上看到的那样,该循环已被优化。
call std::chrono::_V2::steady_clock::now()
mov r12, rax
call std::chrono::_V2::steady_clock::now()
Run Code Online (Sandbox Code Playgroud)
该代码使用以下代码进行编译:
g++ bench.cpp -Wall -Wextra -std=c++11 -O3
Run Code Online (Sandbox Code Playgroud)
并gcc version 6.3.0 20170516 (Debian 6.3.0-18+deb9u1)安装在英特尔®至强®W-2195处理器上。
我是计算机上的唯一用户,我尝试在没有优先级(nice或chrt)的情况下运行,结果是相同的。
我经过1亿次迭代得到的结果是:
Y轴以纳秒为单位,是线的结果
std::chrono::duration_cast<std::chrono::nanoseconds>(t2 - t1).count()
Run Code Online (Sandbox Code Playgroud)
这4行让我想到:没有缓存/ L1 / L2 / L3缓存未命中(即使“ L3缓存未命中”行似乎与L2行距离太近)
我不确定为什么会出现缓存未命中,可能是结果的存储,但是它不在测量的代码中。
我已尝试使用1500循环运行10000次程序,因为此处理器的L1缓存为: …
我的代码中有一个错误,当放回到同一向量中时,它试图放回一些值。
#include <iostream>
#include <vector>
struct ComplexObject
{
// for display only
inline static int cpt {};
int indice {};
ComplexObject(std::vector<ComplexObject>& storage, int trick)
{
indice = cpt;
cpt++;
if (trick == 0 )
{
std::cout << "Creating single Object. Storage size: " << storage.size() << std::endl;
}
else
{
std::cout << "Creating double Object. Storage size: " << storage.size() << std::endl;
storage.emplace_back(storage, 0);
std::cout << "Storage size after double creation : " << storage.size() << std::endl;
}
} …Run Code Online (Sandbox Code Playgroud)