【发布时间】:2010-05-12 09:21:56
【问题描述】:
我正在尝试在我的 Delphi 应用程序中充分发挥性能,现在我找到了一个适用于动态数组的程序。其中最慢的一行是
SetLength(Result, Len);
用于初始化动态数组。当我查看 SetLength 过程的代码时,我发现它远非最佳。调用顺序如下:
_DynArraySetLength -> DynArraySetLength
DynArraySetLength 获取数组长度(初始化为零),然后使用 ReallocMem,这对于初始化也是不必要的。
我一直在做 SetLength 来初始化动态数组。也许我错过了什么?有没有更快的方法来做到这一点?
编辑:描述主要算法会占用大量空间,实际上是不必要的,因为它试图优化其中的一小部分。一般而言,它是车辆路线问题 (http://en.wikipedia.org/wiki/Vehicle_routing_problem) 的一个变种。我确实需要数以千计的分配,因为我必须保留所有数据,并将其分开保存。如果我能在这里想到一些巧妙的数据结构,可能会有所帮助,但我能想到的任何东西都会大大增加代码的复杂性。 基本上我已经在算法层面上做了我能做的一切,所以现在我试图从底层的东西中得到我能做的一切。所以这是一个相当狭窄的问题:是否有可能增加这个特定的调用。而且我认为要做到这一点,我需要根据 SetLength 代码编写自己的初始化函数。并使其内联。
【问题讨论】:
-
SetLength()用于初始化和设置数组的长度。所以,我看不到如何优化它 - 拆分这两个功能。这真的是一个问题吗?您应该只在初始化期间执行它吗?或者你在一个循环中执行了很多次? -
一个长度为零的数组由一个 nil 指针表示,FWIW - 实际上将 nil 分配给一个动态数组位置等价于 SetLength(arr, 0)。如果
SetLength太慢,你可能调用它太频繁了;调用一次,为最大尺寸设置足够大的尺寸,然后独立跟踪长度,就像 Andreas 在他的回答中所说的那样。 -
您是否调用过执行无数次 SetLength(Result, Len) 的函数,或者调用过无数次调用执行一次 SetLength(Result, Len) 的函数?在第一种情况下,请检查下面的 Andreas 答案。在第二种情况下,它会更加棘手。
-
您能描述一下基本算法吗,特别提到何时请求内存分配?
-
@LeGEC 我有无数次调用一个函数,该函数执行一次 SetLength(Result, Len)。
标签: performance delphi