C # 'ref' ключевое слово, производительность - PullRequest
12 голосов
/ 23 мая 2009

Если у вас есть объект Bitmap, который необходимо передать многочисленным методам (около 10) и, наконец, событию, где он должен быть окончательно утилизирован после его использования, будет ли (с точки зрения производительности) выгодно передавать его в каждый из этих методов по ссылке вместо значения?

При передаче по значению объект копируется, по ссылке его нет.

(Производительность имеет решающее значение в этой ситуации. Приложение должно работать как можно быстрее.)

Ответы [ 4 ]

31 голосов
/ 23 мая 2009

Растровое изображение - это ссылочный тип. Передача ссылочного типа по значению не копирует объект, а просто ссылку на объект. Передача растрового изображения по ссылке, а не по значению, не принесет никакой пользы.

17 голосов
/ 23 мая 2009

Поскольку растровое изображение является ссылочным типом, в этом сценарии нет практических различий в производительности, поскольку оно уже передается по ссылке на метод.

Я бы порекомендовал статью Джона Скита по этому вопросу для подробного объяснения того, как "по ссылке" и "по значению" работают в C #.

9 голосов
/ 23 мая 2009

Какой тип вы используете именно для хранения растрового изображения? Например, System.Drawing.Bitmap является ссылочным типом / классом. Когда вы передаете ссылку на метод (в качестве аргумента), ссылка передается по значению. ( Сделана копия ссылки ... не объект ) Таким образом, на 32-разрядном компьютере для хранения копии будет выделено четыре байта.

Использование ключевого слова ref не сильно влияет на производительность, за исключением того, что передается та же ссылка (копия ссылки не делается). Имеет следующие преимущества

  • Только очищает намерение, что метод, принимающий параметр , может изменить его , и вызывающая сторона может получить измененное значение после выполнения.
  • И переменная должна быть инициализирована вызываемым пользователем перед передачей в качестве аргумента вызываемой функции, принимающей параметр ref.
7 голосов
/ 23 мая 2009

'ref' не передает сам объект в функцию, вместо этого он передает ссылку на переменную, в которой он хранится / at.

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

Если объект является структурой (или перечислением, или другим базовым типом), ключевое слово 'ref' передает ссылку на переменную, в которой хранится структура, что по-прежнему вызывает SLR-скорость разыменования при каждом его использовании, но если Вы не указываете это, тогда программа должна выделить память для нового экземпляра структуры и затем скопировать ее. В большинстве случаев быстрее передавать структуры с помощью ключевого слова ref, но это может быть не так, если это действительно небольшая структура, или если она сильно разыменована (и я имею в виду LOT).

Так что, если вы передаете структуру, тогда обычно лучше использовать ref, иначе на самом деле особой разницы не будет (издержки на этапе разыменования незначительны).

Да, и чтобы фактически ответить на вопрос, Bitmap - это класс, поэтому ключевое слово 'ref' на самом деле не повлияет на скорость по сравнению с параметром, отличным от 'ref'.

...