Задать вопрос
iamkisly
@iamkisly
Собираю админки на dotnet и extjs

Сравнение скорости копирования массивов разными способами?

Сравниваю производительность копирования массива, использую немного измененный код из тикета SO по ссылке. Оригинальному обсуждению уже больше года, а тут net8 подьехал.. почему бы и не посмотреть.

Сделал сразу по трем версиям фреймворка: dotnet 6/7/8, и интересные результаты на небольших массивах в net 6.

65a9386051ca7902921567.png
65a9386aacf27818339732.png
65a938779b23b062405778.png
65a9388125d22787304841.png

Как видите net6 люто выигрывает в скорости у net7 и net8 на небольших массивах (да и в принципе с ростом версии фреймворка есть снижение производительности), в то время как на больших разница невилируется (шкала логарифическая по основанию 2) вопрос почему.. нет ли у меня ошибки в бенчмарке, которая повлияла на результат ?

Ну и как видно span.copyTo(span) имеет выигрыш только на не больших массивах, использование которых в реальной жизни крайне редко.

65aa1015848fe055927490.png

UPDATE
https://gist.github.com/iamkisly/9e65f18bfce828e3b...
65aa4bacafc46744598997.png
65aa4b7c86e8a453904490.png
65aa4b87814cf730716827.png
65aa4b92a3541109604106.png
65aa4b9e32983427412155.png
  • Вопрос задан
  • 81 просмотр
Подписаться 1 Простой 2 комментария
Пригласить эксперта
Ответы на вопрос 1
AshBlade
@AshBlade
Просто хочу быть счастливым
Ошибки:
1. В каждом тесте лучше передавать массивы через аргументы, а не словарем - это тоже немного влияет
2. Циклы внутри не нужны - сам фреймворк запускает это все множество раз под капотом

вопрос почему

Разные версии, разные реализации. Мы исходный код платформы не знаем.
Тем более, на скорость могут повлиять разные факторы:
- Локальность кэша
- Загруженность системы
- Работа ОС (переключение контекста, свапинг)

на не больших массивах, использование которых в реальной жизни крайне редко.

Это откуда такие данные?
- Enumerable с 1 элементом
- Результат фильтрации выбрал только 2-3 штуки
- Сериализация примитивных (и не только) типов

Я вообще молчу, что stackalloc надо вызывать с маленьким размером, а работать с ним через Span

UPD: запустил бенчмарк у себя и получил примерно такие же результаты. Система: AMD Ryzen 5, Ubuntu 22.04, 16 GB RAM

Предполагаю, что причина в следующем:
1. .NET 8 вышел только недавно и нет достаточного кол-ва патчей
2. Платформа сейчас больше ориентируется на Web и на такие моменты, как оптимизация копирования, времени уделяется мало

P.S. скорее причина в 1
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы