Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.64/11: Рейтинг темы: голосов - 11, средняя оценка - 4.64
13 / 13 / 1
Регистрация: 24.06.2011
Сообщений: 135

Что быстрее - ref или return?

29.07.2013, 18:21. Показов 2181. Ответов 8
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте!
Интересует вопрос, будет ли функция работать быстрее если в качестве параметра передать ссылку на массив и в дальнейшем производить запись в него, или же использовать оператор return возвращающий массив?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
29.07.2013, 18:21
Ответы с готовыми решениями:

Что быстрее switch(enum) или if else?
Может кто нибудь знает,какая конструкция лучше в плане производительности: 1) enum e{one, two, three}; switch (e) { case.. ...

Что быстрее - Java или C#
1) C# быстрее Java? 2) C# легче Java? 3) Что лучше подходит для web: Java или C#?

Что быстрее целочисленные вычисления или с плавающей запятой?
Что быстрее на dotNET? Считать с типом int или float, double. Кто-нибудь знает бенчмарки или статьи, где сравнивают скорость вычислений...

8
Почетный модератор
Эксперт .NET
 Аватар для NickoTin
8728 / 3680 / 404
Регистрация: 14.06.2010
Сообщений: 4,513
Записей в блоге: 9
29.07.2013, 18:24
Если вы используете ссылочный тип данных то модификаторы ref/out нужны только если Вы решите пересоздать объект, если Вы его только редактируете, то ref/out не нужны.

C#
1
2
3
4
5
6
7
8
9
10
11
12
void Call(int[] arr)
{
    for(...)
       arr[i] = ...;
}
 
void Call(ref int[] arr)
{
    arr = new int[...];
    for(...)
       arr[i] = ...;
}
0
13 / 13 / 1
Регистрация: 24.06.2011
Сообщений: 135
29.07.2013, 18:31  [ТС]
Dопрос про скорость, что быстрее будет либо так

C#
1
2
3
4
5
byte[] arr1;
void call(out byte[] arr1)
{
...
}
либо так

C#
1
2
3
4
5
6
byte[] call()
{
byte[] arr1 = new byte[..];
...
return arr1;
}
???
0
 Аватар для PingWiN0x20
55 / 55 / 8
Регистрация: 13.05.2010
Сообщений: 105
29.07.2013, 18:42
Без разницы. В первом случае функция принимает в качестве аргумента адрес массива, во втором - возвращает его. Т.е. то же самое, только бантик сбоку.
0
13 / 13 / 1
Регистрация: 24.06.2011
Сообщений: 135
29.07.2013, 18:48  [ТС]
Цитата Сообщение от PingWiN0x20 Посмотреть сообщение
Без разницы. В первом случае функция принимает в качестве аргумента адрес массива, во втором - возвращает его. Т.е. то же самое, только бантик сбоку.
А как на счет выделения новой памяти? В теле второй функции каждый раз происходит выделение новой памяти под массив, а в первой такого не происходит. Или выделение происходит моментально и не требует особых затрат?
0
 Аватар для PingWiN0x20
55 / 55 / 8
Регистрация: 13.05.2010
Сообщений: 105
29.07.2013, 18:51
Между созданием массива вне функции и внутри неё не вижу ни какой разницы по времени.
И, кстати, ref принято использовать для передачи уже инициализированных переменных. Если переменная будет инициализирована внутри функции, то передавать нужно по out.
0
13 / 13 / 1
Регистрация: 24.06.2011
Сообщений: 135
29.07.2013, 18:59  [ТС]
Хорошо, спасибо за ответ.
0
 Аватар для PingWiN0x20
55 / 55 / 8
Регистрация: 13.05.2010
Сообщений: 105
29.07.2013, 19:01
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
        static int[] CreateArray()
        {
            return new int[100];
        }
 
        static void CreateArray(out int[] array)
        {
            array = new int[100];
        }
 
        static void Main(string[] args)
        {
            List<int[]> arrays_list = new List<int[]>(100);
            for (int i = 0; i < arrays_list.Count; i++)
            {
                arrays_list[i] = new int[100];
                // эквивалентно этому...
                arrays_list[i] = CreateArray();
                // и эквивалентно этому...
                int[] array;
                CreateArray(out array);
                arrays_list[i] = array;
            }
 
        }
В приведенном мной примере создается список массивов, которые инициализируются тремя разными способами. Третий, пожалуй, чуть-чуть дольше на огромным (миллионы массивов) объемах.
1
Почетный модератор
Эксперт .NET
 Аватар для NickoTin
8728 / 3680 / 404
Регистрация: 14.06.2010
Сообщений: 4,513
Записей в блоге: 9
29.07.2013, 19:25

Не по теме:

Ivan76, ИМХО, Вы не те моменты которые нужно оптимизировать собрались.


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

Хотя на практике JIT'ом для случая с возвращением метода через return был сгенерирован чуть меньший по объему код и задествующий только регистры для возврата значения, и не было вызова clr!JIT_CheckedWriteBarrierEAX (судя по названию для синхронизации объекта), так что в теории метод с возвратом будет быстрее... но это всё такие мелкие детали, что даже не знаю, для .NET глупо на этом останавливаться и пытаться оптимизировать, ИМХО.

source
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
    class Program
    {
        // Console.WriteLine используется только для того
        // чтобы методы не были выкинты во время оптимизации,
        // т.к. по сути они ничего не делают
        static void Main(string[] args)
        {
            Debugger.Break();
            call0();
            call1();
            Debugger.Break();
        }
 
        static void call0()
        {
            var t = call00();
 
            foreach (var b in t)
            {
                Console.Write(b);
            }
        }
 
        static byte[] call00()
        {
            Console.WriteLine("0");
            return new byte[100];
        }
 
        static void call1()
        {
            byte[] buff;
            call10(out buff);
 
            foreach (var b in buff)
            {
                Console.Write(b);
            }
        }
 
        static void call10(out byte[] buff)
        {
            Console.WriteLine("1");
            buff = new byte[100];
        }
    }

by ref
вызов метода call10(out byte[])
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
Normal JIT generated code
ConsoleApplication3.Program.call1()
Begin 004b0110, size 4a
 
C:\Visual Studio 2010\Projects\ConsoleApplication3\ConsoleApplication3\Program.cs @ 39:
>>> 004b0110 55              push    ebp
004b0111 8bec            mov     ebp,esp
004b0113 57              push    edi
004b0114 56              push    esi
004b0115 53              push    ebx
004b0116 83ec08          sub     esp,8
004b0119 33c0            xor     eax,eax
004b011b 8945f0          mov     dword ptr [ebp-10h],eax
004b011e 8d4df0          lea     ecx,[ebp-10h]
004b0121 ff15cc372000    call    dword ptr ds:[2037CCh] (ConsoleApplication3.Program.call10(Byte[] ByRef), mdToken: 06000005)
 
C:\Visual Studio 2010\Projects\ConsoleApplication3\ConsoleApplication3\Program.cs @ 41:
004b0127 8b5df0          mov     ebx,dword ptr [ebp-10h]
004b012a 33f6            xor     esi,esi
004b012c 8b4304          mov     eax,dword ptr [ebx+4]
004b012f 8945ec          mov     dword ptr [ebp-14h],eax
004b0132 85c0            test    eax,eax
004b0134 7e1c            jle     004b0152
004b0136 0fb67c3308      movzx   edi,byte ptr [ebx+esi+8]
 
C:\Visual Studio 2010\Projects\ConsoleApplication3\ConsoleApplication3\Program.cs @ 43:
004b013b e804ce9f70      call    mscorlib_ni+0x36cf44 (70eacf44) (System.Console.get_Out(), mdToken: 06000946)
004b0140 8bc8            mov     ecx,eax
004b0142 8bd7            mov     edx,edi
004b0144 8b01            mov     eax,dword ptr [ecx]
004b0146 8b4030          mov     eax,dword ptr [eax+30h]
004b0149 ff500c          call    dword ptr [eax+0Ch]
 
C:\Visual Studio 2010\Projects\ConsoleApplication3\ConsoleApplication3\Program.cs @ 41:
004b014c 46              inc     esi
004b014d 3975ec          cmp     dword ptr [ebp-14h],esi
004b0150 7fe4            jg      004b0136
 
C:\Visual Studio 2010\Projects\ConsoleApplication3\ConsoleApplication3\Program.cs @ 45:
004b0152 8d65f4          lea     esp,[ebp-0Ch]
004b0155 5b              pop     ebx
004b0156 5e              pop     esi
004b0157 5f              pop     edi
004b0158 5d              pop     ebp
004b0159 c3              ret
метод call10(out byte[])
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
Normal JIT generated code
ConsoleApplication3.Program.call10(Byte[] ByRef)
Begin 00330170, size 34
 
C:\Visual Studio 2010\Projects\ConsoleApplication3\ConsoleApplication3\Program.cs @ 49:
>>> 00330170 55              push    ebp
00330171 8bec            mov     ebp,esp
00330173 56              push    esi
00330174 8bf1            mov     esi,ecx
00330176 e8c9cdb770      call    mscorlib_ni+0x36cf44 (70eacf44) (System.Console.get_Out(), mdToken: 06000946)
0033017b 8bc8            mov     ecx,eax
0033017d 8b153c213003    mov     edx,dword ptr ds:[330213Ch] ("1")
00330183 8b01            mov     eax,dword ptr [ecx]
00330185 8b403c          mov     eax,dword ptr [eax+3Ch]
00330188 ff5010          call    dword ptr [eax+10h]
 
C:\Visual Studio 2010\Projects\ConsoleApplication3\ConsoleApplication3\Program.cs @ 50:
0033018b b92e4db470      mov     ecx,offset mscorlib_ni+0x4d2e (70b44d2e)
00330190 ba64000000      mov     edx,64h
00330195 e8a620f4ff      call    00272240 (JitHelp: CORINFO_HELP_NEWARR_1_VC)
0033019a 8d16            lea     edx,[esi]
0033019c e84711bd71      call    clr!JIT_CheckedWriteBarrierEAX (71f012e8)
 
C:\Visual Studio 2010\Projects\ConsoleApplication3\ConsoleApplication3\Program.cs @ 51:
003301a1 5e              pop     esi
003301a2 5d              pop     ebp
003301a3 c3              ret

return
вызов метода call00()
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
Normal JIT generated code
ConsoleApplication3.Program.call0()
Begin 00330080, size 3d
 
C:\Visual Studio 2010\Projects\ConsoleApplication3\ConsoleApplication3\Program.cs @ 22:
>>> 00330080 55              push    ebp
00330081 8bec            mov     ebp,esp
00330083 57              push    edi
00330084 56              push    esi
00330085 53              push    ebx
00330086 50              push    eax
00330087 ff15b4372800    call    dword ptr ds:[2837B4h] (ConsoleApplication3.Program.call00(), mdToken: 06000003)
0033008d 8bd8            mov     ebx,eax
 
C:\Visual Studio 2010\Projects\ConsoleApplication3\ConsoleApplication3\Program.cs @ 24:
0033008f 33f6            xor     esi,esi
00330091 8b4304          mov     eax,dword ptr [ebx+4]
00330094 8945f0          mov     dword ptr [ebp-10h],eax
00330097 85c0            test    eax,eax
00330099 7e1c            jle     003300b7
0033009b 0fb67c3308      movzx   edi,byte ptr [ebx+esi+8]
 
C:\Visual Studio 2010\Projects\ConsoleApplication3\ConsoleApplication3\Program.cs @ 26:
003300a0 e89fceb770      call    mscorlib_ni+0x36cf44 (70eacf44) (System.Console.get_Out(), mdToken: 06000946)
003300a5 8bc8            mov     ecx,eax
003300a7 8bd7            mov     edx,edi
003300a9 8b01            mov     eax,dword ptr [ecx]
003300ab 8b4030          mov     eax,dword ptr [eax+30h]
003300ae ff500c          call    dword ptr [eax+0Ch]
 
C:\Visual Studio 2010\Projects\ConsoleApplication3\ConsoleApplication3\Program.cs @ 24:
003300b1 46              inc     esi
003300b2 3975f0          cmp     dword ptr [ebp-10h],esi
003300b5 7fe4            jg      0033009b
 
C:\Visual Studio 2010\Projects\ConsoleApplication3\ConsoleApplication3\Program.cs @ 28:
003300b7 59              pop     ecx
003300b8 5b              pop     ebx
003300b9 5e              pop     esi
003300ba 5f              pop     edi
003300bb 5d              pop     ebp
003300bc c3              ret
метод call00()
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
Normal JIT generated code
ConsoleApplication3.Program.call00()
Begin 003300d0, size 29
 
C:\Visual Studio 2010\Projects\ConsoleApplication3\ConsoleApplication3\Program.cs @ 32:
>>> 003300d0 55              push    ebp
003300d1 8bec            mov     ebp,esp
003300d3 e86cceb770      call    mscorlib_ni+0x36cf44 (70eacf44) (System.Console.get_Out(), mdToken: 06000946)
003300d8 8bc8            mov     ecx,eax
003300da 8b1538213003    mov     edx,dword ptr ds:[3302138h] ("0")
003300e0 8b01            mov     eax,dword ptr [ecx]
003300e2 8b403c          mov     eax,dword ptr [eax+3Ch]
003300e5 ff5010          call    dword ptr [eax+10h]
 
C:\Visual Studio 2010\Projects\ConsoleApplication3\ConsoleApplication3\Program.cs @ 33:
003300e8 b92e4db470      mov     ecx,offset mscorlib_ni+0x4d2e (70b44d2e)
003300ed ba64000000      mov     edx,64h
003300f2 e84921f4ff      call    00272240 (JitHelp: CORINFO_HELP_NEWARR_1_VC)
003300f7 5d              pop     ebp
003300f8 c3              ret

з.ы. При этом следует учесть что код сгенерирован под конкретный процессор, т.е. на других машинах он может отличаться.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
29.07.2013, 19:25
Помогаю со студенческими работами здесь

Что быстрее, база, или список?
Здравствуйте! Работаю над проектом, который, в перспективе, будет работать с большими объёмами данных. Сейчас подошёл вплотную к тому,...

ЧТО БЫСТРЕЕ? Доступ к БД или к файлам?
Мне приходится хранить много новостей в базе данных, но так как база разрастается, то запросы к ней со временем становятся все медленнее....

Что использовать лучше, быстрее? OLEDB или Microsoft.Jet ?
Что использовать лучше, быстрее? OLEDB or Microsoft.Jet

Написать метод с использованием return, out, ref
Ввести матрицы А(4, 4) и В(3, 3). Решить уравнение cx+d=0, где с – минимальный элемент матрицы А, d – минимальный элемент матрицы В....

Подскажите как переделать функцию c ref на return
Добрый вечер, подскажите и поясните как можно данную функцию переделать что бы не использовать ref а возвращать с помощью return но при...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11680&amp;d=1772460536 Одним из. . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru