Вы ошиблись в предложении Барри Келли.Когда я тестирую его на Delphi 7, он даже медленнее, чем ваша первая реализация, и он дает неверные результаты, если длина вашей строки не делится на 4.
Я проверил это с помощью этой строки: StringOfChar('c', 100000) + 'x';
и вашей новой функциивозвращает True AllElementsAreEqual('c', StringOfChar('c', 100000) + 'x')
, в то время как он должен возвращать False.
Ваша реализация медленнее, потому что вы пытаетесь сделать вашу строку делимой на четыре (в которой вы терпите неудачу, но вы сами можете выяснить, почему она терпит неудачу) итаким образом создавая новую строку, которая требует выделения памяти, что является дорогостоящим.
Другая опасная вещь, которую вы делаете, - это позволяет динамическому массиву (массиву целых чисел) указывать на строку.Оба пересчитаны, и это может привести к странным результатам.Пожалуйста, следуйте советам Барри Келли и используйте PIntegerArray!
Я думаю, Барри Келли имел в виду это:
function AllElementsAreEqual(const aElement: Char; const aStr: string): Boolean;
var
lIntArray: PIntegerArray;
i: Integer;
lTest: Integer;
begin
Result := True;
lTest := Ord(aElement) + Ord(aElement) shl 8 + Ord(aElement) shl 16 + Ord(aElement) shl 24;
lIntArray := @aStr[1];
for i := 0 to Length(aStr) div 4 - 1 do
if lIntArray[i] <> lTest then
begin
Result := False;
Exit;
end;
for i := Length(aStr) - (Length(aStr) mod 4) + 1 to Length(aStr) do
if aStr[i] <> aElement then
begin
Result := False;
Exit;
end;
end;
Примечание: ваша функция возвращает True для пустых строк, это нормально?
NB2: Пожалуйста, присуждайте баллы за ответ Барри Келли, а не за мой, потому что это действительно слишком большой комментарий, а не ответ.