老规矩,无废话,直接上代码:
procedure TForm1.Button1Click(Sender: TObject);
var
i: Integer;
dTime: Cardinal;
//ABytes: RawByteString;
ABytes: TBytes;
begin
dtime := GetTickCount;;
for i := 0 to 1000000 - 1 do
begin
SetLength(ABytes, Random(65535) + 1);
end;
dTime := GetTickCount - dTime;
Caption := Format('Elapsed %d ms.', [dTime]);
end;
initialization
Randomize;
finalization
end.
在我本机测试的结果分别是:46ms和577ms,很显然,这至少有12.5倍的性能差距。普通的客户端程序也许没有什么影响,但对于服务器程序来说,这绝对是灾难!很明显,字符串的速度比Byte的速度快多了。从理论上来讲,编译器的处理方式应该是一样的,但是,实际却差这么多。只能说明一点儿:没有编译器人才真的是最大的问题!
顺便说一下fpc的测试结果:63ms和390ms!
结论:
尽量使用RawByteString作为数据存储、处理方式。
其他(未做测试):
1.使用TBytes作为字符集转换时会浪费更多时间。
2.可能对数据集的处理有一定影响。
3.Indy以及RTC的内部TBytes处理速度也有一定影响。此时如果需要提高性能,建议换用IOCP或者其他组件吧。