多次调用索引运算符的性能

时间:2016-01-28 22:45:10

标签: c++

如果我们有以下代码:

pip install rpy2

**编辑:上面假设在循环的每次迭代中必须多次访问单词特定索引处的单词

4 个答案:

答案 0 :(得分:7)

使用:string temp = vec1[i].word你制作副本,所以速度会慢一些。

使用引用:string& temp = vec1[i].word来防止副本对性能的影响(如果它可以使更多代码更易于阅读,我会这样做。)

根据您实际执行的操作,编译器可能会以完全相同的方式优化这些版本。我会专注于在最佳代码之前编写可读代码(但仍然尽量不做不必要的复制)。

修改(奖金)

正如评论中所指出的,如果你不打算修改字符串,那么写const string& temp = vec1[i].word会更好。它将为编译器和未来的读者提供关于您可以对您的参考做什么的提示。

答案 1 :(得分:1)

检查实验,其中证明 vec1[i].word直接比使用临时变量更快:

linux16:/home/users/grad1459/Desktop>g++ -o foo -O3  main.cpp
linux16:/home/users/grad1459/Desktop>./foo
Without temp 1.918358000 seconds wall clock time.
With temp 2.170181000 seconds wall clock time.

以下是最小代码,应使用优化标记进行编译

int main()
{
    const int N = 10000000;
    my_struct mystruct = { "foo", 1 };
    for (int i = 0; i < N; i++)
        vec1.push_back(mystruct);

    wallclock_t t;
    double s;

    wallclock_mark(&t);
    for (int i = 0; i < N; i++)
        vec1[i].word = "bla";
    s = wallclock_since(&t);
    printf("Without temp %.9f seconds wall clock time.\n", s);

    wallclock_t t1;
    double s1;

    wallclock_mark(&t1);
    for (int i = 0; i < N; i++) {
        string tmp = vec1[i].word;
        tmp = "bla";
    }
    s1 = wallclock_since(&t1);
    printf("With temp %.9f seconds wall clock time.\n", s1);

    return 0;
}

我缩小了示例,我在Time measurements中有时间测量方法。

但是,我使用answer suggested by Gris,使用临时更快地使用

Without temp 1.967400000 seconds wall clock time.
With temp 0.864647000 seconds wall clock time.

答案 2 :(得分:1)

一个好的优化编译器可能会将vec1[i]表达式提升到一个寄存器中,所以它根本不重要。

或者您可以编写代码和个人资料,从而明确地回答您的问题。

答案 3 :(得分:0)

使用vec1[i].word更快,因为您不需要为内存中的新位置分配值,您只需引用现有位置而不是添加/修改任何内容。

然而,性能差异很小。