MD>А вот не выкинется ли оно из IL-кода целиком для Release build? Т.е. оба метода будут учитывать лишь первый параметр, т.е. окажутся идентичны.
Неа, JIT не настолько продвинут в этом плане.
Вот в .Net Native — вполне вероятно. Если ещё не — в следующих релизах точно. Как с инлайном закончат, конечно. Без него половина прочих оптимизация не особо эффективна.
пока не будет, сорри.
S>В качестве компенсации, Jack128 напомнил про: S>
S> static int Do(int i, params int[] values)
S> {
S> return i + 1;
S> }
S> static int Do2(int i, int[] values)
S> {
S> return i + 1;
S> }
S>
S>В чём разница между этими двумя методами с точки зрения перфоманса?
S>Без подсказок, и так слишком быстро угадываете, черти
если вызывать Do не передавая готового массива, то он будет создаваться неявно.
соотв. если много вызывать перфоманс будет деградировать
а если вот так Do(1, null) то думаю никакой разницы
Das Reich der Freiheit beginnt da, wo die Arbeit aufhört. (c) Karl Marx
S>Без подсказок, и так слишком быстро угадываете, черти
Скрытый текст
Ты не забыл "= null" в сигнатуре Do2()?
Я так понимаю это про оптимизацию Array.Empty<T> которую добавили в Roslyn?
Тогда оно ещё зависит от разрядности. Как минимум на 64-х разрядной системе если приложение запущено в 32bit, я видел как вызов с Array.Empty<T> по скорости практически равен вызову с new int[0] (одна секунда на лярд итераций). Если то же приложение на той же машине запущено в x64 — то разница становится 10x в пользу оптимизации на Array.Empty.
Nemerle — power of metaprogramming, functional, object-oriented and imperative features in a statically-typed .NET language
Здравствуйте, Sinix, Вы писали:
MD>>А вот не выкинется ли оно из IL-кода целиком для Release build? Т.е. оба метода будут учитывать лишь первый параметр, т.е. окажутся идентичны. S>Неа, JIT не настолько продвинут в этом плане.
Кстати, не факт. Сейчас скомпилировал, получил такой код для тела цикла:
for (var i = 0; i < Count; i++) {
r += Do1(i);
}
for (int i = 0; i < Count; i++) {
00007FF85E2A0C8E lea esi,[rsi+rdi+1]
00007FF85E2A0C92 inc edi
00007FF85E2A0C94 cmp edi,989680h
00007FF85E2A0C9A jl 00007FF85E2A0C8E
Не берусь судить, но либо джит осведомлен об Array.Empty<T>, либо он гораздо умней, чем о нем думают Запретил джиту инлайнить метод, и джит вынес вызов Array.Empty за пределы цикла:
00007FF85E290C89 call 00007FF8BDA32B00
for (int i = 0; i < Count; i++) {
00007FF85E290C8E mov rdx,2A84EB67700h
00007FF85E290C98 mov rdx,qword ptr [rdx]
00007FF85E290C9B mov ecx,edi
r += Do1(i);
00007FF85E290C9D call 00007FF85E290078
00007FF85E290CA2 add eax,esi
00007FF85E290CA4 mov esi,eax
00007FF85E290CA6 inc edi
00007FF85E290CA8 cmp edi,989680h
00007FF85E290CAE jl 00007FF85E290C8E
Здравствуйте, rameel, Вы писали:
R>Не берусь судить, но либо джит осведомлен об Array.Empty<T>, либо он гораздо умней, чем о нем думают Запретил джиту инлайнить метод, и джит вынес вызов Array.Empty за пределы цикла:
Может он атрибутом Pure помечен?
... << RSDN@Home 1.0.0 alpha 5 rev. 0 on Windows 8 6.2.9200.0>>
R>Не берусь судить, но либо джит осведомлен об Array.Empty<T>, либо он гораздо умней, чем о нем думают Запретил джиту инлайнить метод, и джит вынес вызов Array.Empty за пределы цикла:
Оно и раньше было, но работало если повезёт.
Или пример удачный, или эвристики в RyuJit прокачали.
Здравствуйте, rameel, Вы писали:
R>Да, точно. Как-то я пропустил этот момент с Pure-атрибутом. А давно джит умеет с ним работать?
Спроси чего попроще. Просто догадка. Не факт что он вообще его учитывает, а не самостоятельно чистоту детектирует по коду. Надо, короче, экспериментировать.
... << RSDN@Home 1.0.0 alpha 5 rev. 0 on Windows 8 6.2.9200.0>>
Здравствуйте, rameel, Вы писали:
R>Здравствуйте, Sinix, Вы писали:
DR>>>В первом случае новый массив создаётся при каждом вызове, а во втором можно передать уже созданный.
Между прочим, это отклонение от спецификации C# и breaking change, о чём я им говорил ещё пару лет назад. Спецификация гарантирует создание нового массива при каждом вызове метода в expanded form. Видимо, они решили, что бенефиты от этой оптимизации перевешивают негативные последствия breaking change (и правильно решили, наверное). Мораль: не нужно в спецификации давать гарантий, которые не являются необходимыми для реализации какой-либо фичи.