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

时间:2012-11-29 18:55:36

标签: 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;

通过分配

,我会看到性能提升吗?
local_ref := my_list[i];

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

2 个答案:

答案 0 :(得分:9)

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

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

最终回答这个问题的最终方法是为替代方案计时。仅根据测量进行优化。

将项目复制到局部变量有更好的理由:表达清晰度。您当前的代码违反了DRY principle

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

for Item in List do
  ....

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

答案 1 :(得分:3)

这完全取决于如何检索my_list[i]。如果它导致一堆函数调用,它可能会产生影响(更不用说任何副作用)。

像往常一样,在进行任何类型的性能重构之前,您应该度量。过早优化.....

为了记录,它是原始Pascal设计中with的“好用”之一:

with my_list[i] do
begin
  something := something_else;
  [...]
end;