小编Giu*_*ppe的帖子

STL算法是否针对速度进行了优化?

我正在测试std :: vector上不同方式循环的速度.在下面的代码中,我考虑了5种方法来计算N = 10000000个元素的向量的所有元素的总和:

  1. 使用迭代器
  2. 使用整数索引
  3. 使用整数索引,展开因子2
  4. 使用整数索引,展开因子4
  5. 使用std :: accumulate

代码用g ++ for windows编译,用于编译的命令行是:

g++ -std=c++11 -O3 loop.cpp -o loop.exe
Run Code Online (Sandbox Code Playgroud)

我运行代码4次,测量每种方法的时间,我得到以下结果(时间以微秒为单位,最大值和最小值给出):

  • 迭代器:8002 - 8007
  • Int指数:8004 - 9003
  • 展开2:6004 - 7005
  • 展开4:4001 - 5004
  • 累积:8005 - 9007

这些实验似乎表明的是:

  1. 循环使用迭代器与整数索引没有太大区别,至少在完全优化时是这样.

  2. 展开循环可以获得回报

  3. 令人惊讶的是,stl :: accumulate的性能更差.

虽然结论1和2是预期的,但数字3却相当令人惊讶.难道不是所有书都说使用STL算法而不是自己编写循环吗?

我在衡量时间或者解释结果的方式上是否犯了任何错误?如果您尝试下面给出的代码,你们有不同的情况吗?

#include <iostream>
#include <chrono>
#include <vector>
#include <numeric>

using namespace std;
using namespace std::chrono;



int main()
{
    const int N = 10000000;
    vector<int> v(N);
    for (int i = 0; i<N; ++i)
        v[i] = i; …
Run Code Online (Sandbox Code Playgroud)

c++ algorithm stl

8
推荐指数
1
解决办法
923
查看次数

Matlab:避免for循环在具有相同标签的值中找到最大值

我需要在matlab中找到具有相同标签的值中的最大值,并且我试图避免使用for循环.

具体来说,我有一个L标签数组和一个V相同大小的值数组.我需要生成一个数组S,其中包含每个值L的最大值V.一个例子将更好地解释:

L = [1,1,1,2,2,2,3,3,3,4,4,4,1,2,3,4]

V = [5,4,3,2,1,2,3,4,5,6,7,8,9,8,7,6]
Run Code Online (Sandbox Code Playgroud)

然后,输出数组S的值将是:

s(1) = 9 (the values V(i) such that L(i) == 1 are: 5,4,3,9 -> max = 9)

s(2) = 8 (the values V(i) such that L(i) == 2 are: 2,1,2,8 -> max = 8)

s(3) = 7 (the values V(i) such that L(i) == 3 are: 3,4,5,7 -> max = 7)

s(4) = 8 (the values V(i) such that L(i) == …
Run Code Online (Sandbox Code Playgroud)

matlab for-loop labels

2
推荐指数
1
解决办法
136
查看次数

标签 统计

algorithm ×1

c++ ×1

for-loop ×1

labels ×1

matlab ×1

stl ×1