Который является более эффективным способом иметь дело с Массивом Записей?

Каков более эффективный путь?

FUserRecords[I].CurrentInput:=FUserRecords[I].CurrentInput+typedWords;

или

var userRec: TUserRec;
...
userRec:=FUserRecords[I];
userRec.CurrentInput:=userRec.CurrentInput+typedWords;
FUserRecords[I]:=userRec;
7
задан Dian 6 July 2010 в 04:11
поделиться

2 ответа

В описанном вами случае первый пример будет наиболее эффективным.

Записи имеют типы значений , поэтому, когда вы делаете эту строку:

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 @

10
ответ дан 6 December 2019 в 23:00
поделиться

Быстрее и удобнее:

with FUserRecords[I] do 
  CurrentInput := CurrentInput + typedWords;
1
ответ дан 6 December 2019 в 23:00
поделиться
Другие вопросы по тегам:

Похожие вопросы: