Size: a a a

🎄.NET Talks: Evergreen🎄

2020 January 26

А

Артёмка ;) in 🎄.NET Talks: Evergreen🎄
обьясните почему вот второй вариант даже быстрее чем первый
public static string ToStringLastTwo_1(in long number)
{
 char a = (char)((number % 10) + 48);
 char b = (char)((number / 10 % 10) + 48);

 unsafe
 {
   Span<char> stackSpan = stackalloc char[2];

   stackSpan[0] = a;
   stackSpan[1] = b;

   return stackSpan.ToString();
 }
}

public static string ToStringLastTwo_2(long number)
{
 char a = (char)((number % 10) + 48);
 char b = (char)((number / 10 % 10) + 48);

 return a.ToString() + b;
}
источник

А

Артёмка ;) in 🎄.NET Talks: Evergreen🎄
сначала вызывается 2 раза метод для _1 потом 2 раза для _2
источник

A

AleXR in 🎄.NET Talks: Evergreen🎄
Ты время по 2-м вызовам замеряешь?...
источник

А

Артёмка ;) in 🎄.NET Talks: Evergreen🎄
ну да.. второй раз ведь все скомпилировано уже
источник

Dv

Dr. Friedrich von Never in 🎄.NET Talks: Evergreen🎄
Larymar neosilator
ну 478 мертв а вот 1366
для очень мелкой конторки сойдет решение
478 мёртв, а я ещё нет…
источник

Ln

Larymar neosilator in 🎄.NET Talks: Evergreen🎄
Dr. Friedrich von Never
478 мёртв, а я ещё нет…
шото-то я сомневаюсь
источник

Dv

Dr. Friedrich von Never in 🎄.NET Talks: Evergreen🎄
Артёмка ;)
ну да.. второй раз ведь все скомпилировано уже
источник

А

Артёмка ;) in 🎄.NET Talks: Evergreen🎄
AleXR
Ты время по 2-м вызовам замеряешь?...
ну еще щас 13 раз запустил программу второй вариант выиграл со счетом 3-10
источник

Dv

Dr. Friedrich von Never in 🎄.NET Talks: Evergreen🎄
источник

А

Артёмка ;) in 🎄.NET Talks: Evergreen🎄
че
источник

Dv

Dr. Friedrich von Never in 🎄.NET Talks: Evergreen🎄
Я понимаю, что это бессмысленно, но расскажу всё-таки, в чём проблемы твоего «бенчмарка».
источник

Dv

Dr. Friedrich von Never in 🎄.NET Talks: Evergreen🎄
Не для тебя, а для других случайных читателей.
источник

А

Артёмка ;) in 🎄.NET Talks: Evergreen🎄
знаете, я щас переставил вызовы этих двух методов (теперь они вызываются в другом порядке, и тот который я оптимизировал вызывается последним), счет 13-0 в пользу оптимизированного
источник

Dv

Dr. Friedrich von Never in 🎄.NET Talks: Evergreen🎄
Во-первых, нельзя тестировать время одного или малого количества вызовов. JIT, память и процессорные кэши должны нормально прогреться
источник

Dv

Dr. Friedrich von Never in 🎄.NET Talks: Evergreen🎄
В новом фреймворке вообще tiered jit, ты учитываешь его параметры?
источник

Dv

Dr. Friedrich von Never in 🎄.NET Talks: Evergreen🎄
Конечно, нет.
источник

Dv

Dr. Friedrich von Never in 🎄.NET Talks: Evergreen🎄
Далее, и ты это уже заметил, компилировать код бенчмарков нужно особенным образом
источник

Dv

Dr. Friedrich von Never in 🎄.NET Talks: Evergreen🎄
Потому что от последовательности вызовов может зависеть разная рантайм машинерия
источник

Dv

Dr. Friedrich von Never in 🎄.NET Talks: Evergreen🎄
Ну, банально, type initializer будет вызван в первом месте, где используется тип
источник

Dv

Dr. Friedrich von Never in 🎄.NET Talks: Evergreen🎄
Поэтому, если ты пишешь
Benchmark1();
Benchmark2();


То внезапно в результаты замера Benchmark1() может войти скрытая стоимость инициализации типов каких-нибудь.
источник