C++ 递增原子计数器和普通计数器的性能测量
我在用这样的程序测试原子变量的增量比普通变量慢多少:C++ 递增原子计数器和普通计数器的性能测量,c++,performance,c++14,chrono,gcc4.9,C++,Performance,C++14,Chrono,Gcc4.9,我在用这样的程序测试原子变量的增量比普通变量慢多少: size_t Normal{}; std::atomic<size_t> Atomic{}; std::chrono::steady_clock::time_point start0 = std::chrono::steady_clock::now(); while(1) { ++Normal; if(std::chrono::duration_cast<std::chrono::seco
size_t Normal{};
std::atomic<size_t> Atomic{};
std::chrono::steady_clock::time_point start0 = std::chrono::steady_clock::now();
while(1)
{
++Normal;
if(std::chrono::duration_cast<std::chrono::seconds>
(std::chrono::steady_clock::now() - start0).count() > 1)
{
std::cout << "Microseconds " << std::chrono::duration_cast<std::chrono::microseconds>
(std::chrono::steady_clock::now() - start0).count() << std::endl;
break;
}
}
std::chrono::steady_clock::time_point start1 = std::chrono::steady_clock::now();
while(1)
{
Atomic.fetch_add(1);
if(std::chrono::duration_cast<std::chrono::seconds>
(std::chrono::steady_clock::now() - start1).count() > 1)
{
std::cout << "Microseconds " << std::chrono::duration_cast<std::chrono::microseconds>
(std::chrono::steady_clock::now() - start1).count() << std::endl;
break;
}
}
std::cout << "Normal:" << Normal << std::endl;
std::cout << "Atomic:" << Atomic.load() << std::endl;
std::cout << "Atomic / Normal %" << double(Atomic.load()) / double(Normal) * 100.0 << std::endl;
size\u t Normal{};
std::原子{};
std::chrono::staddy_clock::time_point start0=std::chrono::staddy_clock::now();
而(1)
{
++正常;
如果(标准::时间::持续时间)
(标准::时钟::稳定时钟::现在()-start0).count()>1)
{
std::cout循环中的计时内容很可能比两个add都要昂贵。这是错误的做法。请只测量开始和停止时间一次,并在两个时间点之间增加计数器10亿次。根据测量的持续时间计算平均值。注意编译器优化。顺便说一句,您的帖子缺少一个qu估计。@knivil如果你在不发出内存限制的情况下将一个值增加10亿次,那么优化程序将省略整个循环。我的问题是“为什么可能更好的机器给出的结果几乎是更差一个数量级的结果”。实际上,我的第一个意图是粗略估计正常和原子变量的id生成速度。