gpt4 book ai didi

delphi - 如何非常快速地生成具有不同 "branch"长度的二维数组

转载 作者:行者123 更新时间:2023-12-03 18:08:44 24 4
gpt4 key购买 nike

我是一名 Delphi 程序员。在一个程序中,我必须生成具有不同“分支”长度的二维数组。它们非常大,操作需要几秒钟(很烦人)。

例如:

var a: array of array of Word;
i: Integer;

begin
SetLength(a, 5000000);
for i := 0 to 4999999 do
SetLength(a[i], Diff_Values);
end;

我知道命令 SetLength(a, dim1, dim2) 但不适用。甚至没有为 dim2 设置最小值(> 0)并从那里继续,因为 dim2 的最小值为 0(一些“分支”可以为空)。

那么,有没有办法让它变快呢?不只是 5..10%,而是非常快...

谢谢。

最佳答案

在处理大量数据时,需要完成大量工作,这为完成这些工作设定了理论上的最小时间。

对于 500 万次迭代中的每一次,您需要:

  • 以某种方式确定“分支”的大小
  • 从内存管理器分配一个合适大小的新数组
  • 将新数组使用的所有内存清零(SetLength 会自动为您完成)

第 1 步完全在您的控制之下,并且可以进行优化。不过,如果您使用的是现代版本的 Delphi,那么 2 和 3 的速度与它们的速度差不多。 (如果您使用的是旧版本,您可能会受益于安装 FastMM 和 FastCode,它们可以加快这些操作。)

如果合适的话,您可以做的另一件事是惰性初始化。与其尝试一次分配所有 500 万个数组,不如首先执行 SetLength(a, 5000000);。然后当你需要到达一个“分支”时,首先检查它的length = 0。如果是,它还没有被初始化,所以将它初始化为合适的长度。这总体上并没有节省时间,实际上总共会花费更长的时间,但它确实分散了初始化时间,因此用户不会注意到。

如果你的初始化速度已经快到了,而且你的情况是不能在这里使用惰性初始化,那么你基本上就不走运了。这就是处理大量数据的代价。

关于delphi - 如何非常快速地生成具有不同 "branch"长度的二维数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5476216/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com