Есть ли разница в производительности между inc (i) и i: = i + 1 в Delphi? - PullRequest
14 голосов
/ 26 сентября 2008

У меня есть процедура с большим количеством

i := i +1;

в нем и я думаю

 inc(i);

выглядит намного лучше. Есть ли разница в производительности или вызов функции просто встроен компилятором? Я знаю, что это, вероятно, не имеет никакого значения для моего приложения, мне просто любопытно.

РЕДАКТИРОВАТЬ: я сделал некоторые измерения производительности и обнаружил, что разница очень мала, на самом деле всего 5,1222741794670901427682121946224e-8! Так что это действительно не имеет значения. И варианты оптимизации действительно не сильно изменили результат. Спасибо за все советы и предложения!

Ответы [ 6 ]

17 голосов
/ 27 сентября 2008

Существует огромная разница, если Проверка переполнения включена. В основном Inc не делает проверку переполнения . Сделайте, как было предложено, и используйте окно разборки, чтобы увидеть разницу, когда у вас включены эти опции компилятора (они различны для каждого).

Если эти параметры отключены, то нет никакой разницы. Правило большого пальца, используйте Inc, когда вас не волнует ошибка проверки диапазона (поскольку вы не получите исключения!).

7 голосов
/ 26 сентября 2008

Современные компиляторы оптимизируют код.
inc (i) и i: = i + 1; в значительной степени одинаковы.

Используйте то, что вы предпочитаете.

Редактировать: Как поправил Джим Маккит: с проверкой переполнения есть разница. Inc не выполняет проверку диапазона.

6 голосов
/ 26 сентября 2008

Все зависит от типа «я». В Delphi каждый обычно объявляет переменные цикла как «i: Integer», но это также может быть «i: PChar», который разрешает в PAnsiChar все, что находится ниже Delphi 2009 и FPC (я предполагаю здесь), и в PWideChar на Delphi 2009 и Delphi.NET (также догадка).

Поскольку Delphi 2009 может выполнять указатель-математику, Inc (i) также можно делать для типизированных указателей (если они определены с включенным POINTER_MATH).

Например:

type
  PSomeRecord = ^RSomeRecord;
  RSomeRecord = record
    Value1: Integer;
    Value2: Double;
  end;

var
  i: PSomeRecord; 

procedure Test;
begin
  Inc(i); // This line increases i with SizeOf(RSomeRecord) bytes, thanks to POINTER_MATH !
end;

Как уже говорили другие авторы: Относительно легко увидеть, что компилятор сделал из вашего кода, открыв:

Представления> Отладка Windows> Процессор Windows> Разборка

Обратите внимание, что параметры компилятора, такие как OPTIMIZATION, OVERFLOW_CHECKS и RANGE_CHECKS, могут влиять на конечный результат, поэтому вам следует позаботиться о том, чтобы настройки были в соответствии с вашими предпочтениями.

Подсказка: в каждом модуле $ INCLUDE файл, который управляет параметрами компилятора, таким образом, вы не потеряете настройки, если ваш .bdsproj или .dproj каким-то образом поврежден. (Посмотрите на исходный код JCL для хорошего примера)

3 голосов
/ 26 сентября 2008

Вы можете проверить это в окне CPU во время отладки. Сгенерированные инструкции процессора одинаковы для обоих случаев.

Я согласен Inc(I); выглядит лучше, хотя это может быть субъективно.

Исправление: я только что нашел это в документации для Inc:

"На некоторых платформах Inc может генерировать оптимизированный код, особенно полезный в плотные петли. "

Так что, вероятно, рекомендуется придерживаться Inc.

1 голос
/ 26 сентября 2008

Вы всегда можете написать обе части кода (в отдельных процедурах), поставить точку останова в коде и сравнить ассемблер в окне ЦП.

В общем, я бы использовал inc (i) везде, где он, очевидно, используется только как какой-то цикл / индекс, и + 1, где 1 облегчает поддержку кода (т. Е. Возможно изменение на другое целое число в будущем) или просто более читабельное с точки зрения алгоритма / спецификации.

0 голосов
/ 26 сентября 2008

"На некоторых платформах Inc может генерировать оптимизированный код, особенно полезный в тесных циклах." Для оптимизированного компилятора, такого как Delphi, это не важно. Это о старых компиляторах (например, Turbo Pascal)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...