Я работаю с некоторыми критериями, и я заметил какое -то странное поведение с моими методами против реализации LINQ. Тестирование на .net 9, x64 ryujit. < /P>
Я определяю максимальное значение в десятичном массиве. В тестировании я написал упрощенную версию метода LINQ Max (Decimal) , который удаляет накладные расходы на проверку типов. В противном случае это точная копия из источника.
Я ожидал, что производительность будет в основном идентичной, но странная вещь в том, что моя упрощенная версия медленнее , чем Linq.
private decimal[] _array = default!;
[GlobalSetup]
public void GlobalSetup()
{
_array = new decimal[100];
for (int i = 0; i < _array.Length; i++)
_array = (decimal)i;
}
[Benchmark]
public decimal MyMax()
{
ReadOnlySpan span = _array;
if (span.IsEmpty)
throw new ArgumentException();
decimal value = span[0];
for (int i = 1; (uint)i < (uint)span.Length; i++)
{
if (span > value)
{
value = span;
}
}
return value;
}
[Benchmark]
public decimal Linq()
{
return _array.Max();
}
< /code>
Intel Core i7-7700 CPU 3.60GHz (Kaby Lake), 1 CPU, 8 logical and 4 physical cores
.NET SDK 9.0.304
[Host] : .NET 9.0.8 (9.0.825.36511), X64 RyuJIT AVX2
DefaultJob : .NET 9.0.8 (9.0.825.36511), X64 RyuJIT AVX2
| Method | Mean | Error | StdDev | Code Size | Allocated |
|------- |---------:|--------:|--------:|----------:|----------:|
| MyMax | 498.7 ns | 3.63 ns | 3.03 ns | 578 B | - |
| Linq | 446.2 ns | 4.48 ns | 3.97 ns | 759 B | - |
< /code>
Just to ensure this wasn't some sort of JIT side effect, I tried putting the Linq method before MyMax so that Linq would be benchmarked first, and results were the same: Linq is still faster than MyMax.
I admit, I'm really bad at assembly, so I can't really determine anything looking at the disassembly. But, regardless, considering I'm using the same C# code as Linq, even if I was able to find what was different I still wouldn't know why it happened.
I know it's not a huge difference, but more than anything, I just really wonder, academically, why it's happening. Can someone enlighten me? I sure hope it's something simple and obvious I'm missing.
Thanks in advance!
Подробнее здесь: https://stackoverflow.com/questions/797 ... ementation
Почему упрощенная версия максимального (десятичного) медленнее, чем реализация LINQ? ⇐ C#
Место общения программистов C#
1755459187
Anonymous
Я работаю с некоторыми критериями, и я заметил какое -то странное поведение с моими методами против реализации LINQ. Тестирование на .net 9, x64 ryujit. < /P>
Я определяю максимальное значение в десятичном массиве. В тестировании я написал упрощенную версию метода LINQ Max (Decimal) , который удаляет накладные расходы на проверку типов. В противном случае это точная копия из источника.
Я ожидал, что производительность будет в основном идентичной, но странная вещь в том, что моя упрощенная версия медленнее , чем Linq.
private decimal[] _array = default!;
[GlobalSetup]
public void GlobalSetup()
{
_array = new decimal[100];
for (int i = 0; i < _array.Length; i++)
_array[i] = (decimal)i;
}
[Benchmark]
public decimal MyMax()
{
ReadOnlySpan span = _array;
if (span.IsEmpty)
throw new ArgumentException();
decimal value = span[0];
for (int i = 1; (uint)i < (uint)span.Length; i++)
{
if (span[i] > value)
{
value = span[i];
}
}
return value;
}
[Benchmark]
public decimal Linq()
{
return _array.Max();
}
< /code>
Intel Core i7-7700 CPU 3.60GHz (Kaby Lake), 1 CPU, 8 logical and 4 physical cores
.NET SDK 9.0.304
[Host] : .NET 9.0.8 (9.0.825.36511), X64 RyuJIT AVX2
DefaultJob : .NET 9.0.8 (9.0.825.36511), X64 RyuJIT AVX2
| Method | Mean | Error | StdDev | Code Size | Allocated |
|------- |---------:|--------:|--------:|----------:|----------:|
| MyMax | 498.7 ns | 3.63 ns | 3.03 ns | 578 B | - |
| Linq | 446.2 ns | 4.48 ns | 3.97 ns | 759 B | - |
< /code>
Just to ensure this wasn't some sort of JIT side effect, I tried putting the Linq method before MyMax so that Linq would be benchmarked first, and results were the same: Linq is still faster than MyMax.
I admit, I'm really bad at assembly, so I can't really determine anything looking at the disassembly. But, regardless, considering I'm using the same C# code as Linq, even if I was able to find what was different I still wouldn't know why it happened.
I know it's not a huge difference, but more than anything, I just really wonder, academically, why it's happening. Can someone enlighten me? I sure hope it's something simple and obvious I'm missing.
Thanks in advance!
Подробнее здесь: [url]https://stackoverflow.com/questions/79736820/why-is-a-simplified-version-of-maxdecimal-slower-than-linqs-implementation[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия