代码之家  ›  专栏  ›  技术社区  ›  J__

大动态数组-写入速度慢

  •  4
  • J__  · 技术社区  · 16 年前

    我有一个例程,它将有序元素(“日”或“夜”枚举类型)添加到多维动态数组中,该数组声明为:

    TShiftType = (stDay, stNight);
    TScheduleArray =  array of array of array [1..DaysPerWeek] of TShiftType;
    

    数组可以包含1个元素之间的任何内容(例如。 (Day, Day, Day, Day, Day, Night, Night) )超过20000个元素。根据处理的周数,每个元素本身可能有子元素。

    因此,两周数组中的一个元素可能如下所示:

    ((stDay, stDay, stDay, stDay, stDay, stNight, stNight), (stDay, stDay, stDay, stDay, stDay, stNight, stNight))

    当元素数量相对较低(大约在1000以下)时,这种方法运行速度非常快,效果非常好。一旦周数和元素数增加,只需向数组中添加一个新元素(在调用 SetLength 将数组长度增加1)开始以指数方式减慢。

    有时我也会遇到访问冲突。当我在Delphi中使用“查找错误”功能时,它会将我带到 @DynArrayAsg 方法。但我从来没有得到过 EOutOfMemory

    这是对内存访问速度减慢的预期行为吗?我使用的是Delphi6。

    1 回复  |  直到 16 年前
        1
  •  7
  •   Mason Wheeler    16 年前

    是的,因为当您重新分配它时,如果没有足够的连续空间只在现有数组的末尾添加一个元素,它必须找到另一个足够大的块,分配它,复制整个现有数组,然后取消分配原始数组。阵列越大,副本越长。

    TList通过将其内部数组按两种大小的幂分配,而不是“完全按照我需要的大小”来帮助缓解此问题,然后使用计数变量来标记实际使用的上限。也许你可以做类似的事情?

    FastMM