访问容器对象与本地分配的变量

Mar*_*tin 4 delphi generics

任何人都可以告诉我,如果在一个紧凑的循环中使用了大量的对象,那么将容器中的对象分配给局部变量是否有任何性能优势.

我有一个大的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;
Run Code Online (Sandbox Code Playgroud)

通过分配我会看到性能提升吗?

local_ref := my_list[i];
Run Code Online (Sandbox Code Playgroud)

在每次迭代开始时?我使用的是通用容器(TList <<> MyObject <>>).

Dav*_*nan 9

做出你建议的改变肯定会带来更快的代码.访问本地变量总是比访问属性getter更快TList<T>.首先,这些getter对索引执行有效性检查.但是即使对于一个具有最简单的getter可能性的类,也很难击败缓存的本地性能.

现在,在这种情况下,这是否重要无法从这里说出来.如果你在循环中做任何远程非常重要的事情,那么项目getter的运行时将是无关紧要的.循环可能运行大量迭代的事实不是关键因素.最重要的是你在每次迭代中花费了多少时间.如果你花费1个时间单位来调用项目getter,1000个时间单位来做你对每个项目做的任何事情,那么getter性能不是问题.

最终,回答这个问题的最终方式是为替代方案提供时间.仅根据测量进行优化.

将项目复制到局部变量有更好的理由:表达清晰度.您当前的代码严重违反DRY原则.

最后,如果它使用for循环,那么这段代码最好读取:

for Item in List do
  ....
Run Code Online (Sandbox Code Playgroud)

现在,对于in循环可能比传统循环慢,但你应该重视清晰度和可维护性.优化通常会使代码难以维护并且更容易出错.结论:只能优化瓶颈.