Передайте параметр типа значения, используя ref или нет, что быстрее? - PullRequest
1 голос
/ 08 декабря 2011

Какой из следующих методов сработает быстрее?

    static void Do(int i)
    {
    }
or
    static void Do(ref int i)
    {
    }

Ответы [ 2 ]

2 голосов
/ 08 декабря 2011

В общем, я бы сказал, не беспокойтесь об этом.Однако, если это действительно важно в этом случае, профилируйте его и посмотрите.Без измерения вы никогда не узнаете, какая версия метода действительно будет работать лучше, особенно в вашем реальном случае, так как JIT может оптимизировать один лучше другого и т. Д.

При этом на небольшом уровнеуровень, ответ действительно "это зависит".В вашем случае передача по ref потенциально будет медленнее на x64, так как она делает большую копию (область памяти, которая 64-битная) по сравнению с просто копией 32-битного int.С практической точки зрения это не имеет значения вообще.

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

Иногда это значимая оптимизация производительности.Например, многие движки, связанные с 3D, делают это для передачи векторов или матриц, поскольку они могут быть большой структурой.Например, см. Matrix.Multiply в XNA, в котором используются параметры ref и out вместо копирования матриц по значению.Это более оптимизировано, поскольку матрица имеет 128 байтов, поэтому передача ссылки на 4 или 8 байтов намного эффективнее.

0 голосов
/ 08 декабря 2011

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

...