Delphi Copy函数效率的问题
技术交流,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
相关文档:
Delphi中的容器类
作者 陈省
从Delphi 5开始VCL中增加了一个新的Contnrs单元,单元中定义了8个新的类,全部都是基于标准的TList 类。
TList 类
TList 类实际上就是一个可以存储指针的容器类,提供了一系列的方法和属性来添加,删除,重排,定位,存取和排序容器中的类,它是基于数组的机制来实现 ......
delphi中application.processmessages的作用
procedure TForm1.Button2Click(Sender: TObject);
var
I, J, X, Y: Word;
begin
I := 0;
J := 0;
while I < 64000 do
begin
Randomize;
& ......
一、概述及示例代码
Delphi中包括许多已经封装好的类及控件,其中的非可视化控件库以功能方式划分可处理诸多应用需求。若使用C++实现系统时对某些功能简单调用delphi中现成的库时即可。因此将delphi中的库以DLL形式封装好之后如何将方法导出可供C++调用是本文记录的重点。C++调用的方式有多种,在这里只讨论一种静 ......
TDXDraw DirectDraw 和 Direct3D 组件
TDXDIB 容纳DIB(设备无关位图,Device Independent Bitmap)的组件
TDXImageList 图片列表组件
TDX3D Direct3D 组件 (和TDXDraw一起使用)
TDXSound DirectSound 组件
TDXWave 容纳 Wave(波形音频 ......
名称 类型 说明
--------------------------------------------------------- ......