Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/154.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 递增原子计数器和普通计数器的性能测量_C++_Performance_C++14_Chrono_Gcc4.9 - Fatal编程技术网

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生成速度。