任何人都可以告诉我,如果在一个紧凑的循环中使用了大量的对象,那么将容器中的对象分配给局部变量是否有任何性能优势.
我有一个大的for循环,在循环内部,来自容器的对象经常访问.即
for i := 0 to 100000 do
begin
  my_list[i].something := something;
  my_list[i].something_else := something;
  my_list[i].something_else := something;
  my_list[i].something_else := something;
  my_list[i].something_else := something;
end;
通过分配我会看到性能提升吗?
local_ref := my_list[i];
在每次迭代开始时?我使用的是通用容器(TList <<> MyObject <>>).
做出你建议的改变肯定会带来更快的代码.访问本地变量总是比访问属性getter更快TList<T>.首先,这些getter对索引执行有效性检查.但是即使对于一个具有最简单的getter可能性的类,也很难击败缓存的本地性能.
现在,在这种情况下,这是否重要无法从这里说出来.如果你在循环中做任何远程非常重要的事情,那么项目getter的运行时将是无关紧要的.循环可能运行大量迭代的事实不是关键因素.最重要的是你在每次迭代中花费了多少时间.如果你花费1个时间单位来调用项目getter,1000个时间单位来做你对每个项目做的任何事情,那么getter性能不是问题.
最终,回答这个问题的最终方式是为替代方案提供时间.仅根据测量进行优化.
将项目复制到局部变量有更好的理由:表达清晰度.您当前的代码严重违反DRY原则.
最后,如果它使用for循环,那么这段代码最好读取:
for Item in List do
  ....
现在,对于in循环可能比传统循环慢,但你应该重视清晰度和可维护性.优化通常会使代码难以维护并且更容易出错.结论:只能优化瓶颈.
| 归档时间: | 
 | 
| 查看次数: | 151 次 | 
| 最近记录: |