我试图使用一个简单的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) 今天,当我尝试实现这个简单的操作时,我想分享一些让我头脑发热的东西:
我发现了执行相同操作的不同方法:
std::inner_product.std::accumulate函数.我想通过使用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)