我正在测试使用这样的程序增加原子变量比普通变量慢多少:
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;
在我的笔记本电脑(4GB,Intel(R) Core(TM) i3-2328M CPU @ 2.20GHz)上,我平均获得了 2400 万个增量。
在更好的机器上(8 x Intel(R) Xeon(R) CPU E5-4610 v2 @ 2.30GHz,256 GB RAM)令我惊讶的是,尽管处理器要好得多,但我平均获得了 300 万个增量。
两台机器都有相同的操作系统(Fedora 21)。
我知道串行程序中的内核(或处理器)数量与性能的提高无关,但我将这些硬件信息仅作为对读者的提示。