如果temp变量用于索引,速度会变慢吗? 我正在阅读C++中的数学相关的源代码。在我下面的示例中,有许多类似于第一个循环的循环。我认为如果我存储一些临时变量用于索引,它们可能会更有效。然而,我错了

如果temp变量用于索引,速度会变慢吗? 我正在阅读C++中的数学相关的源代码。在我下面的示例中,有许多类似于第一个循环的循环。我认为如果我存储一些临时变量用于索引,它们可能会更有效。然而,我错了,c++,loops,C++,Loops,我打算存储I*8的结果,以便减少乘法的次数。下面的示例已简化。最初的情况可能更复杂。在类似的情况下,我减少乘法次数的努力是否无效 与我的直觉相反,如果我使用temp变量,速度会慢一些 然后,我使用寄存器来存储临时变量,结果表明,如果使用临时变量,速度会更快 // With register Old Time: 8.9 New Time: 7.8 如果编写一个涉及大量计算的速度密集型应用程序,我应该依靠编译器的优化还是寄存器的优化?如果是多线程,注册会导致任何问题吗 我不太熟悉g++的命令行选项

我打算存储I*8的结果,以便减少乘法的次数。下面的示例已简化。最初的情况可能更复杂。在类似的情况下,我减少乘法次数的努力是否无效

与我的直觉相反,如果我使用temp变量,速度会慢一些

然后,我使用寄存器来存储临时变量,结果表明,如果使用临时变量,速度会更快

// With register
Old
Time: 8.9
New
Time: 7.8
如果编写一个涉及大量计算的速度密集型应用程序,我应该依靠编译器的优化还是寄存器的优化?如果是多线程,注册会导致任何问题吗


我不太熟悉g++的命令行选项。在上面的示例中,我刚刚使用了g++efficiency.cpp。然后,我尝试了-O2选项,在这两种情况下消耗的时间都减少到了0.0。

我将以下内容解释为您的问题

如果编写一个速度密集型应用程序,需要进行大量计算 这样,我应该依靠编译器的优化还是寄存器的优化?如果 多线程,注册会导致任何问题吗

首先,若你们们的目标是并试图衡量一个程序的效率,你们们应该总是在至少-O2(若不是-O3)的情况下运行,这取决于生产中使用的是什么

<>编译器完成了它所能做的一切之后,你可以考虑使用诸如登记变量之类的手工优化。大多数情况下,您会发现register关键字要么被编译器忽略,要么对性能没有显著帮助

对于多线程处理是否会导致寄存器使用出现任何问题,简短的回答是否定的。尽管如此,即使没有寄存器,也有许多方法可以编写错误的多线程程序

问题中提到的相关问题:当您在上运行优化时,为什么您的计时都接近于零

如果编译器可以通过静态分析确定循环的结果从未被使用,或者循环本身可以被更简单的计算(可能是直接添加计数)所取代,那么它将继续这样做,这将大大缩短时间


唯一确定的方法是使用gcc-S-O2在特定优化后显示程序集,并从程序集确定循环是否仍然存在。

-S ftw。晚餐吃什么。您从未提到是否所有上述示例运行都是在发布模式下以相同的优化强度编译的。这不是使用优化编译的,因为在这种情况下,编译器应该消除循环,因为循环不会产生任何结果。但这也意味着计时微优化毫无意义。没有编译器命令行->无法回答的问题。我用你的代码测试:旧:20.4新:9.9。使用-O3编译并使用结果生成Old:6.1 New:6.1I,当register关键字产生任何影响时,我会非常惊讶,因为大多数编译器完全忽略了它。
// With register
Old
Time: 8.9
New
Time: 7.8
#include <cstdio>
#include <ctime>

#define DIM 10000
#define COUNT 100000
int main() {
  clock_t start, end;
  double mtx[8 * DIM] = {0};
  printf("Old\n");
  start = clock();
  for (int count = 0; count < COUNT; ++count) {
    for (int i = 0; i < DIM; ++i) {
      mtx[i * 8 + 0] += 1;
      mtx[i * 8 + 1] += 1;
      mtx[i * 8 + 2] += 1;
      mtx[i * 8 + 3] += 1;
      mtx[i * 8 + 4] += 1;
      mtx[i * 8 + 5] += 1;
      mtx[i * 8 + 6] += 1;
      mtx[i * 8 + 7] += 1;
    }
  }
  end = clock();
  printf("Time: %2.1lf\n", (double)(end - start) / CLOCKS_PER_SEC);

  printf("New\n");
  start = clock();
  /* register */ int j;
  for (int count = 0; count < COUNT; ++count) {
    for (int i = 0; i < DIM; ++i) {
      j = i * 8;
      mtx[j + 0] += 1;
      mtx[j + 1] += 1;
      mtx[j + 2] += 1;
      mtx[j + 3] += 1;
      mtx[j + 4] += 1;
      mtx[j + 5] += 1;
      mtx[j + 6] += 1;
      mtx[j + 7] += 1;
    }
  }
  end = clock();
  printf("Time: %2.1lf\n", (double)(end - start) / CLOCKS_PER_SEC);
  return 0;
}