访问数组中的项与指针引用的性能差异?

tho*_*hom 2 c performance

我很喜欢C - 习惯于脚本语言,如PHP,JS,Ruby等.有关于性能的查询.我知道不应该过早地进行微优化 - 但是,我正在为Google SketchUp编写Ruby C扩展,我正在进行大量的3D计算,因此性能是一个问题.(这个问题也是为了解C是如何工作的.)

通常需要进行多次迭代来处理所有3D数据,因此我正在尝试找出可能更快的内容.

我想知道如果我对该数组条目进行指针引用,是否多次访问数组条目会更快?常见的做法是什么?

struct FooBar arr[10];
int i;
for ( i = 0; i < 10; i++ ) {
  arr[i].foo = 10;
  arr[i].bar = 20;
  arr[i].biz = 30;
  arr[i].baz = 40;
}
Run Code Online (Sandbox Code Playgroud)

这会更快还是更慢?为什么?

struct FooBar arr[10], *item;
int i;
for ( i = 0; i < 10; i++ ) {
  item = &arr[i];
  item->foo = 10;
  item->bar = 20;
  item->biz = 30;
  item->baz = 40;
}
Run Code Online (Sandbox Code Playgroud)

我环顾四周,发现有关变量和指针的讨论 - 通常说指针需要额外的步骤,因为它必须查找地址,然后是值 - 但总的来说没有一点点击中.

但我想知道的是,如果访问C中的数组条目有很大的性能影响?在Ruby中,如果您需要多次访问它,则可以更快地引用该条目 - 但这是Ruby ...

Ste*_*sop 5

不太可能有显着差异.可能发出的代码是相同的.这假设一个模糊的编译器,启用了优化.您可能希望查看反汇编代码,只是为了了解C优化器可以实现的一些功能.你可能会得出这样的结论:"我的代码已经超出了所有人的认可,在这个阶段就没有必要担心这种事情了",这是一种很好的直觉.

可以想象,第一个代码甚至可能更快,如果引入item指针以某种方式干扰任何循环展开或编译器在第一个上执行的其他优化.或者可能是优化器可以找出arr[i].foo等于stack_pointer + sizeof(FooBar) * i,但是一旦你使用指针就无法弄清楚,并最终使用额外的寄存器,溢出其他东西,并带来性能影响.但是我在这一点上疯狂地猜测:通过指针或索引访问数组之间通常几乎没有区别,我的观点是,任何差异都可能出于令人惊讶的原因.