В функции, которая читает данные с данными (данные, означающие исключительно) с диска, что я должен предпочесть? Что лучше?
A) DiskStream.Read(Pointer(s)^, Count)
or
B) DiskStream.Read(s[1], Count)
Примечание:
Я знаю, что оба имеют тот же результат.
Я знаю, что перед вызовом Read я должен установить SetLength of S.
ОБНОВЛЕНИЕ
S - AnsiString.
Вот полная функция:
{Считывает кучу символов из файла. Почему "ReadChars", а не "ReadString"? Эта функция читает строки С++ (длина строки также не записывалась на диск). Итак, я должен указать количество символов для чтения в качестве параметра. }
function TMyStream.ReadChars(out s: AnsiString; CONST Count: Longint): Boolean;
begin
SetLength(s, Count);
Result:= Read(s[1], Count)= Count;
end;
Тест скорости
В моем тесте скорости первый подход был немного быстрее, чем второй. Я использовал файл 400 Мбайт, из которого я читал строки около 200000 раз. Процесс был установлен на высокий приоритет.
Лучшее время для чтения: 1,35 для варианта В и 1,37 для варианта А.
Средний балл:
В среднем, B забил также 20 мс лучше, чем A.
Тест повторялся 15 раз для каждого варианта.
Разница действительно маленькая. Он может попасть в диапазон ошибок измерения. Вероятно, это будет важно, если я буду читать строки чаще и из большего файла. Но на данный момент позвольте сказать, что обе строки кода выполняют одно и то же.
ANSWER
Вариант A - может быть крошечный бит быстрее
Вариант B - (очевидно) гораздо легче читать, и он больше Delphi-ish. Мои предпочтения.
Примечание:
Я видел Embarcadero, используя вариант A в примере TStreamReadBuffer, но с TBytes вместо String.