【发布时间】:2010-07-12 16:33:02
【问题描述】:
众所周知,SameStr(S1, S2) 比 S1 = S2 快,在 Delphi 中 var S1, S2: string。
(而且,当然,SameText(S1, S2) 比 AnsiLowerCase(S1) = AnsiLowerCase(S2) 快得多。)
但是,据我了解,SameStr(S1, S2) 与S1 = S2 做的事情完全相同,所以我不禁想知道为什么 Delphi 编译器在测试时不使用SameStr 代码使用 = 运算符进行字符串相等。这肯定是有原因的吧?
一些基准测试
一个简单的程序,
program Project1;
{$APPTYPE CONSOLE}
uses
SysUtils,
RejbrandCommon;
const
N = 1000000;
var
Strings1, Strings2: StringArray;
i: integer;
b: {dummy }boolean;
procedure CreateRandomStringArrays;
var
i: integer;
begin
SetLength(Strings1, N);
SetLength(Strings2, N);
for i := 0 to N - 1 do
begin
Strings1[i] := RandomString(0, 40);
Strings2[i] := RandomString(0, 40);
end;
end;
begin
CreateRandomStringArrays;
StartClock;
for i := 0 to N - 1 do
if Strings1[i] = Strings2[i] then
b := not b;
StopClock;
OutputClock;
StartClock;
for i := 0 to N - 1 do
if SameStr(Strings1[i], Strings2[i]) then
b := not b;
StopClock;
OutputClock;
Pause;
end.
在哪里
function RandomString(const LowerLimit: integer = 2; const UpperLimit: integer = 20): string;
var
N, i: integer;
begin
N := RandomRange(LowerLimit, UpperLimit);
SetLength(result, N);
for i := 1 to N do
result[i] := RandomChar;
end;
和内联
function RandomChar: char;
begin
result := chr(RandomRange(ord('A'), ord('Z')));
end;
“时钟”函数只是包装 QueryPerformanceCounter、QueryPerformanceFrequency 和 Writeln,产生输出
2.56599325762716E-0002
1.24310093156453E-0002
ratio ~ 2.06
如果我们比较的两个字符串的长度差异很大,那么差异就更大了。我们尝试
Strings1[i] := RandomString(0, 0); // = '';
Strings2[i] := RandomString(0, 40);
获得
1.81630411160156E-0002
4.44662043198641E-0003
ratio ~ 4.08
那么为什么编译器在为S1 = S2 编写汇编时不使用SameStr 代码呢?
更新
看完 Cosmin Prund 的精彩回答后,忍不住设置
Strings1[i] := RandomString(40, 40);
Strings2[i] := RandomString(40, 40);
产生长度相等的字符串。
2.74783364614126E-0002
1.96818773095322E-0002
ratio ~ 1.40
嗯...SameStr 还是赢了...
我的规格
CPU Brand String: Intel(R) Core(TM) i7 CPU 870 @ 2.93GHz
Memory: 6 GB
OS: Windows 7 Home Premium (64-bit)
Compiler/RTL: Delphi 2009
更新
看起来(请参阅 Cosmin Prund 出色答案下方的 cmets)就像 = 运算符在 D2009 和 D2010 之间更改。谁能证实这一点?
【问题讨论】:
-
如果你想运行一些额外的测试,你可能想修复你的 RandomString 函数 (Result[N] -> Result[I])
-
@Ken Bourassa:哦,很好看!
标签: performance delphi string compiler-construction