Каков более эффективный путь?
FUserRecords[I].CurrentInput:=FUserRecords[I].CurrentInput+typedWords;
или
var userRec: TUserRec;
...
userRec:=FUserRecords[I];
userRec.CurrentInput:=userRec.CurrentInput+typedWords;
FUserRecords[I]:=userRec;
В описанном вами случае первый пример будет наиболее эффективным.
Записи имеют типы значений , поэтому, когда вы делаете эту строку:
userRec:=FUserRecords[I];
Вы фактически копируете содержимое записи в массиве в локальную переменную. И когда вы делаете обратное, вы снова копируете информацию. Если вы выполняете итерацию по массиву, это может оказаться довольно медленным, если ваш массив и записи довольно большие.
Если вы хотите пойти по второму пути, чтобы ускорить процесс, вы можете управлять записью в массиве напрямую, используя указатель на запись, например:
type
TUserRec = record
CurrentInput: string;
end;
PUserRec = ^TUserRec;
var
LUserRec: PUserRec;
...
LUserRec := @FUserRecords[I];
LUserRec^.CurrentInput := LUserRec^.CurrentInput + typedWords;
(как обсуждалось в комментариях, символы вставки (^ ) являются необязательными (я добавил их здесь только для полноты).
Конечно, я должен отметить, что вам действительно нужно делать это только в том случае, если на самом деле есть проблемы с производительностью. Всегда полезно профилировать ваше приложение, прежде чем вы начнете кодировать такого рода оптимизацию.
РЕДАКТИРОВАТЬ: Одно предостережение ко всем обсуждениям проблемы производительности, которую вы рассматриваете, заключается в том, что если большая часть ваших данных в записях является строками, то большая часть любой производительности, потерянной в показанном вами примере, будет в конкатенация строк, а не обработка записей.
Кроме того, строки в основном хранятся в записи как указатели, поэтому запись фактически будет иметь размер любых целых чисел и т. Д., Плюс размер указателей на строки. Таким образом, когда вы объединяете строку, размер записи не увеличивается. Вы можете в основном рассматривать часть вашего кода, связанную с манипуляциями со строками, как отдельную проблему по сравнению с манипуляциями с записями.
Вы упомянули в своих комментариях ниже, это для хранения ввода с нескольких клавиатур, я не могу представить, что у вас будет более 5-10 элементов в массиве. При таком размере выполнение этих шагов по оптимизации кода на самом деле не сильно увеличит скорость.
Я считаю, что и ваш первый пример, и приведенный выше код с использованием указателя будут иметь примерно одинаковую производительность. Вы должны использовать то, что вам легче всего читать и понимать.
N @
Быстрее и удобнее:
with FUserRecords[I] do
CurrentInput := CurrentInput + typedWords;