2010-05-16 3 views
6

У меня есть метод на C#, который должен возвращать очень большой массив (или любую другую большую структуру данных, если на то пошло).C# функция нормальное возвращаемое значение VS out или ref аргумент

Есть ли увеличение производительности при использовании параметра ref или out вместо стандартного возвращаемого значения?

I.E. есть ли производительность или другой выигрыш в использовании

void function(sometype input, ref largearray) 

над

largearray function(sometype input) 
+0

Я думаю, вы сбиты с толку; вы бы возвращали ссылку на большой массив, а не на массив ... –

+1

Stadard .Net массивы уже являются ссылочными типами. – Dykam

ответ

5

Количества стеки используется на 32-разрядном процессоре x86 для передачи аргументов различных типов:

  • байты: 4 байта
  • BOOL: 4 байта
  • перечисления: 4 байта
  • символ: 4 байта
  • короткий: 4 байта
  • INT: 4 байта
  • длиной: 8 б ytes
  • поплавка: 4 байта
  • дважды: 8 байт
  • десятичное: 16 байт
  • структура: размер выполнения структуры

  • строка: 4 байта
  • массив: 4 байта
  • объект: 4 байта
  • интерфейс: 4 байта
  • указатель: 4 байта
  • экземпляр класса: 4 байта

Те ниже линии являются ссылочными типами, их размер будет в два раза с 64-разрядным процессором.

Для вызова статического метода первые 2 аргумента, которые содержат до 4 байтов, будут передаваться через регистры CPU, а не в стек. Для вызова метода экземпляра только один аргумент будет передаваться через регистры. Остальные передаются в стеке. 64-разрядный процессор поддерживает передачу 4 аргументов через регистры.

Как видно из списка, единственный раз, когда вы должны рассмотреть возможность передачи аргумента ref, для структур. Нормальное руководство для этого состоит в том, чтобы сделать это, когда структура больше 16 байт. Не всегда легко угадать размер времени выполнения структуры, обычно до 4 полей. Меньше, если эти поля являются двойными, длинными или десятичными. Поэтому это руководство обычно рекомендует превратить вашу структуру в класс именно по этой причине.

Также обратите внимание на то, что не сэкономит, передавая аргумент как байтовый или короткий намеренно, int - это тип, которым удовлетворяет 32-разрядный процессор. То же самое для доступных в настоящее время 64-разрядных процессоров.


Возвращаемое значение метода, реальная тема вашего вопроса почти всегда возвращается в регистр CPU. Большинство типов удобно встраиваются в регистры eax или edx: eax, регистр FPU для значений с плавающей запятой. Единственными исключениями являются большие структуры и десятичные числа, они слишком велики, чтобы соответствовать регистру. Они вызываются путем резервирования пространства в стеке для возвращаемого значения и передачи 4-байтового указателя на это пространство в качестве аргумента для метода.

+0

Это ответ, который я ищу.Я не могу понять, как это обозначить как ответ, хотя - я новичок, и, возможно, я боюсь слепого? – user335023

1

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

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

Речь идет о семантике вызова, а не о производительности.

1

Существует нет, просто возвращает массив

1

Там будет никакой разницы между

void function(sometype input, out largearray output) 

над

largearray function(sometype input) 

Однако, если вы делаете

largearray function(sometype input, ref largearray output) 

и вы требуете e, вызывающий должен предварительно выделить большой массив, который, конечно, будет быстрее, но это будет иметь значение, если вы вызовете метод повторно и сохраните большой массив, выделенный между вызовами.

Смежные вопросы