相关疑难解决方法(0)

为什么std :: accumulate这么慢?

我试图使用一个简单的for循环,一个std::accumulate和一个manualy展开的for循环来对数组元素求和.正如我所料,手动展开的循环是最快的循环,但更有趣的是std :: accumulate比简单循环慢得多.这是我的代码,我使用带有-O3标志的gcc 4.7编译它.Visual Studio将需要不同的rdtsc函数实现.

#include <iostream>
#include <algorithm>
#include <numeric>
#include <stdint.h>


using namespace std;

__inline__ uint64_t rdtsc() {
  uint64_t a, d;
  __asm__ volatile ("rdtsc" : "=a" (a), "=d" (d));
  return (d<<32) | a;
}

class mytimer
{
 public:
  mytimer() { _start_time = rdtsc(); }
  void   restart() { _start_time = rdtsc(); }
  uint64_t elapsed() const
  { return  rdtsc() - _start_time; }

 private:
  uint64_t _start_time;
}; // timer

int main()
{
    const int num_samples = 1000;
    float* samples …
Run Code Online (Sandbox Code Playgroud)

c++ optimization performance

17
推荐指数
1
解决办法
2846
查看次数

性能差异:std :: accumulate vs std :: inner_product vs Loop

今天,当我尝试实现这个简单的操作时,我想分享一些让我头脑发热的东西:

在此输入图像描述

我发现了执行相同操作的不同方法:

  1. 通过使用std::inner_product.
  2. 实现谓词并使用该std::accumulate函数.
  3. 使用C风格的循环.

我想通过使用Quick Bench并启用所有优化来执行一些基准测试.

首先,我将两个C++替代品与浮动值进行了比较.这是使用的代码std::accumulate:

const auto predicate = [](const double previous, const double current) {
    return previous + current * current;
};
const auto result = std::accumulate(input.cbegin(), input.cend(), 0, predicate);
Run Code Online (Sandbox Code Playgroud)

通过使用以下std::inner_product功能与此代码:

const auto result = std::inner_product(input.cbegin(), input.cend(), input.cbegin(), 1);
Run Code Online (Sandbox Code Playgroud)

在启用所有优化的情况下运行基准测试后,我得到了以下结果:

在此输入图像描述

两种算法似乎都达到了相同的性能.我确实想进一步尝试C实现:

double result = 0;
for (auto i = 0; i < input.size(); ++i) {
  result += input[i] * input[i];
}
Run Code Online (Sandbox Code Playgroud)

令人惊讶的是,我发现:

在此输入图像描述

我没想到这个结果.我确定有什么问题所以我确实检查了GCC的实现:

template<typename _InputIterator1, typename _InputIterator2, typename …
Run Code Online (Sandbox Code Playgroud)

c++ profiling stl language-lawyer c++14

6
推荐指数
1
解决办法
626
查看次数