Общеизвестно, что SameStr(S1, S2)
быстрее, чем S1 = S2
, где var S1, S2: string
в Delphi.
(И, конечно, 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;
и функции "clock" просто завершают 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
Итак, почему компилятор не использует код SameStr
при записи сборки для S1 = S2
?
Update
После прочтения прекрасного ответа Cosmin Prund, я не мог устоять перед установкой
Strings1[i] := RandomString(40, 40);
Strings2[i] := RandomString(40, 40);
для создания строк одинаковой длины и действительно.
2.74783364614126E-0002
1.96818773095322E-0002
ratio ~ 1.40
Hm... 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
Update
Казалось бы (см. комментарии ниже Cosmin Prund отличный ответ), так как оператор =
был изменен между D2009 и D2010. Кто-нибудь может это подтвердить?