访问速度:局部变量与阵列

时间:2015-03-03 23:19:22

标签: c++ arrays performance variables local

给出这个示例代码:

struct myStruct1 { int one, two; } first; 
struct myStruct2 { myStruct1 n; int c; } second[255];

// this is a member of a structure in an array of structures! 
register int i = second[2].n.one; 
const int u = second[3].n.one; 

while (1)
{
  // do something with second[1].n.one

  // do something with i

  // do something with u
}

哪一个更快?

是否可以将数组索引的本地副本复制到寄存器中?

如果副本在循环内完成,会更快吗?

1 个答案:

答案 0 :(得分:1)

  

哪一个更快?

要知道的唯一方法是衡量或个人资料。您可以查看汇编代码以获得哪一个更快的提示,但事实是在分析中。

  

是否可以将数组索引的本地副本复制到寄存器中?

寄存器可以容纳很多东西。寄存器的使用由编译器和处理器可用的寄存器数量控制。

编译器可以将值放入寄存器或将它们放在堆栈中。最终,值需要进入寄存器。某些处理器能够在不使用寄存器的情况下将内存从一个位置复制到另一个位置编译器是否使用这些功能取决于编译器和优化级别。

  

如果副本在循环内完成,它会更快吗?

循环中不必要的代码会减慢循环速度。编译器可能会将循环内部没有变化的代码分解出来。

某些处理器可以在其指令缓存中包含循环的所有指令;别人没有。同样,所有这些都取决于处理器和编译器优化设置。

微优化

您的问题属于微优化的范畴。通常,这组优化通常会在处理器指令方面获得速度。除非你迭代超过1.0E + 09次,否则优化不会为你带来显着的节省。对于今天的处理器,每个指令的平均增益为100纳秒(或最差情况下为1毫秒)。除非您进行了分析,否则您不希望通过这些优化浪费您的开发工作。

设计,&编码优化

以下是优化列表,它们将获得比微优化更多的性能优势:

  • 删除不需要的要求。
  • 删除未使用的模块。
  • 分享常用模块。
  • 使用高效的数据结构。
  • 删除不必要的工作。
  • 在后台执行任务。
  • 双缓冲。
  • 输入(块),处理(块),输出(块)。
  • 减少函数调用和比较。
  • 通过简化代数或卡纳图来简化代码。