Ответ
Все зависит от того, как вы строите случайные строки.Я использовал модифицированную версию кода, потому что очень немногие из нас имеют модуль RejbrandCommon, и потому что я хотел использовать Excel для завершения анализа (и создания красивых картинок).
Код (пропустите код досм. некоторые выводы):
программа Project3;
{$APPTYPE CONSOLE}
uses
SysUtils, Windows;
const
StringsNumber = 2000000;
var
Strings1, Strings2: array of string;
StrLen: integer;
b: {dummy }boolean;
function RandomString(MinLen, MaxLen:Integer):string;
var N, i:Integer;
begin
N := MinLen + Random(MaxLen-MinLen);
Assert(N >= MinLen); Assert(N <= MaxLen);
SetLength(Result, N);
for i:=1 to N do
Result[i] := Char(32 + Random(1024)); // Random Unicode Char
end;
procedure CreateRandomStringArrays(StrLen:Integer);
var
i: integer;
StrLen2:Integer;
begin
SetLength(Strings1, StringsNumber);
SetLength(Strings2, StringsNumber);
for i := 0 to StringsNumber - 1 do
begin
StrLen2 := StrLen + Random(StrLen div 2);
Strings1[i] := RandomString(StrLen, StrLen2);
StrLen2 := StrLen + Random(StrLen div 2);
Strings2[i] := RandomString(StrLen, StrLen2);
end;
end;
var C1, C2, C3, C4:Int64;
procedure RunTest(StrLen:Integer);
var i:Integer;
begin
CreateRandomStringArrays(StrLen);
// Test 1: using equality operator
QueryPerformanceCounter(C1);
for i := 0 to StringsNumber - 1 do
if Strings1[i] = Strings2[i] then
b := not b;
QueryPerformanceCounter(C2);
// Test 2: using SameStr
QueryPerformanceCounter(C3);
for i := 0 to StringsNumber - 1 do
if SameStr(Strings1[i], Strings2[i]) then
b := not b;
QueryPerformanceCounter(C4);
// Results:
C2 := C2 - C1;
C4 := C4 - C3;
WriteLn(IntToStr(StrLen) + #9 + IntToStr(C2) + #9 + IntToStr(C4));
end;
begin
WriteLn('Count'#9'='#9'SameStr');
for StrLen := 1 to 50 do
RunTest(StrLen);
end.
Я заставил подпрограмму CreateRandomStringArrays
принять параметр StrLen, чтобы можно было запускать несколько похожих тестов в цикле.Я заставил код использовать QueryPerformanceCounter
напрямую и WriteLn
результаты в формате с разделителями табуляции, чтобы я мог скопировать / вставить его в Excel.В Excel я получаю результаты в таком виде:
StrLen = SameStr
1 61527 69364
2 60188 69450
3 72130 68891
4 78847 85779
5 77852 78286
6 83612 88670
7 93936 96773
Затем я немного нормализовал ситуацию.В каждой строке указано максимальное значение «1», а другое значение в процентах от 1. Результат выглядит следующим образом:
StrLen = SameStr
1 0,88 1
2 0,86 1
3 1 0,95
4 0,91 1
5 0,99 1
6 0,94 1
7 0,97 1
А потом я начал играть с подпрограммой CreateRandomStringArrays
для запуска нескольких тестов.
Так выглядит график для исходного случая (CreateRandomStringArrays генерирует строки произвольной длины, длиной от 1 до любых значений на оси X).Синий - результат для оператора "=", красный - для "SameStr", чем ниже, тем лучше.Ясно, что SameStr () имеет ребро для строк длиннее 10 символов.
альтернативный текст http://fisiere.sediu.ro/PentruForumuri/V1_1_to_maxlen.png
Следующий тест, CreateRandomStringArrays
возвращает строки одинаковой длины.Содержимое строк по-прежнему полностью случайное, но длина строк равна любой, которая находится на оси X.На этот раз оператор "=" явно более эффективен:
alt text http://fisiere.sediu.ro/PentruForumuri/V1_equal_strings.png
Теперь реальный вопрос, с REAL-кодом, какова вероятность того, что строки равны?И насколько велика должна быть разница для SameStr (), чтобы начать набирать рельеф?Следующий текст, я строю две строки, первая из которых StrLen (число по оси X), вторая строка имеет длину StrLen + Random (4).Опять же, оператор "=" лучше:
альтернативный текст http://fisiere.sediu.ro/PentruForumuri/V1_rnd_p4.png
Следующий тест, у меня есть две строки, каждая из которых имеет длину: StrLen + Random (StrLen div 10).Оператор "=" лучше.
альтернативный текст http://fisiere.sediu.ro/PentruForumuri/V1_rnd_pm_10p.png
... и мой последний тест, строки длиной +/- 50%.Формула: StrLen + Random (StrLen div 2).SameStr()
выигрывает в этом раунде:
альтернативный текст http://fisiere.sediu.ro/PentruForumuri/V1_rnd_pm_50p.png
Заключение
Я не уверен.Я не ожидал, что это будет связано с длиной строки!Я ожидаю, что обе функции будут обрабатывать строки разной длины молниеносно, но этого не происходит.