gpt4 book ai didi

arrays - Delphi中如何合并2个字符串数组

转载 作者:行者123 更新时间:2023-12-03 14:42:52 25 4
gpt4 key购买 nike

我有 2 个或更多动态字符串数组,其中填充了一些巨大的数据,我想将这 2 个数组合并为一个数组,我知道我可以使用这样的 for 循环来做到这一点:

var
Arr1, Arr2, MergedArr: Array of string;
I: Integer;
begin
// Arr1:= 5000000 records
// Arr2:= 5000000 records

// Fill MergedArr by Arr1
MergedArr:= Arr1;

// Set length of MergedArr to length of ( Arra1 + Arr2 )+ 2
SetLength(MergedArr, High(Arr1)+ High(Arr2)+2);

// Add Arr2 to MergedArr
for I := Low(Arr2)+1 to High(Arr2)+1 do
MergedArr[High(Arr1)+ i]:= Arr2[i-1];
end;

但是处理大数据时速度很慢,有没有像复制数组内存数据这样更快的方法?

最佳答案

首先 string 很特殊,因此应该特殊对待:不要试图智取编译器,保持代码不变。 String 很特殊,因为它是引用算了。每次将字符串从一个位置复制到另一个位置时,它的引用计数都会增加。当引用计数达到0时,字符串被销毁。您的代码运行良好,因为它让编译器知道您在做什么,进而编译器有机会正确增加所有引用计数。

当然,您可以按照 gabr 答案的评论中的建议使用各种技巧,例如用零填充旧数组,以便新数组中的引用计数保持有效,但如果您确实需要,则不能这样做旧的数组也是如此。这有点像黑客(尽管在可预见的 future 可能有效)。 (需要注意的是,我实际上很喜欢这个技巧)。

无论如何,这是我答案的重要部分,您的代码在将字符串从一个数组复制到另一个数组时很可能并不慢,它很可能在其他地方很慢。这是一个简短的控制台应用程序,它创建两个数组,每个数组都有 5M 随机字符串,然后将两个数组合并为第三个数组,并显示创建合并所需的时间。 在我的机器上合并只需要大约 300 毫秒。填充数组需要更长的时间,但我没有计时:

计划 Project26;

{$APPTYPE CONSOLE}

uses SysUtils, Windows;

var a, b, c: array of string;
i: Integer;

Freq: Int64;
Start, Stop: Int64;
Ticks: Cardinal;

const count = 5000000;

begin
SetLength(a,count);
SetLength(b,count);
for i:=0 to count-1 do
begin
a[i] := IntToStr(Random(1));
b[i] := IntToStr(Random(1));
end;

WriteLn('Moving');

QueryPerformanceFrequency(Freq);
QueryPerformanceCounter(Start);

SetLength(c, Length(a) + Length(b));
for i:=0 to High(a) do
c[i] := a[i];
for i:=0 to High(b) do
c[i+Length(a)] := b[i];

QueryPerformanceCounter(Stop);
WriteLn((Stop - Start) div (Freq div 1000), ' milliseconds');
ReadLn;

end.

关于arrays - Delphi中如何合并2个字符串数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6197290/

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