技术交流,DH讲解. 最近和肥鸟交流了下关于字符串方面的知识,而这篇文章是很久以前写的,现在发出来吧. 我们写两段代码来对比下:
第一个用Copy函数:
procedure TForm1.Button1Click(Sender: TObject);
var
a,c:Cardinal;
n:Integer;
D:Double;
i:Integer;
b:string;
begin
c:=0;
for n:=0 to 99 do
begin
a:=GetTickCount;
for i:=0 to 999999 do
begin
b:=Copy(s,1,20);
end;
a:=GetTickCount-a;
C:=C+A;
end;
D:=C/100;
Label1.Caption:=FloatToStr(D);
end;
第二个用MoveMemory函数:
procedure TForm1.Button2Click(Sender: TObject);
var
a,c:Cardinal;
n:Integer;
d:Double;
i:Integer;
b:string;
begin
c:=0;
for n:=0 to 99 do
begin
a:=GetTickCount;
for i:=0 to 999999 do
begin
SetLength(b,20);
MoveMemory(@b[1],@s[1],20);
end;
a:=GetTickCount-a;
C:=C+A;
end;
D:=C/100;
Label2.Caption:=FloatToStr(D);
end;
其中:
procedure TForm1.FormCreate(Sender: TObject);
begin
s:='HuangJackyJackyHuang';
end;
看下实验数据:
1用了 264
2用了 169
当然这是在运行了9999900次才看出来的,如果我们把s赋值成一个很长的字符串看看
当字符串s有100个字符,Copy 100个:
1用了266
2用了181
继续 S有200个字符,Copy 200个的情况
1 244
2 186
可以看出来在短字符串的情况下MoveMemory肯定要快一些,后面字符串增长Copy效率没有下降,
但是SetLength + MoveMemory就下降了
最后s有400个字符Copy 400个,但是我把SetLength放在循环外面了,也就是只SetLength一次,也就只比较Copy和MoveMemory这两个了.
1 216
2 89
哈哈今天换在台式机了,所以2个运行时间都减少了很多.
再测试下SetLength在循环体里面的情况 用了147.
这下子我们可以看出来一个SetLength耗了多少资源.
OK,我们看见了这个结果,可是为什么会这样呢?有朋友想了解没有?
要了解就要深入函数内部去:
我们先看1的情况:
Unit1.p