Как вам производительность встроенного инструмента для сериализации и десериализации JSON?
#csharp #benchmarks by Nabi Karampoor
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥55👍5🥱4❤1
From_Junior_to_Genius_an_optimization_story_by_Israel_Lot_ITNEXT.pdf
8.5 MB
✅Получится довольно любопытная история оптимизации. Версия джуна выглядит следующим образом👇
public static uint Checksum(ReadOnlySpan<byte> arr)
{
if (arr.Length == 0) return 0;
uint sum0 = 0, sum1 = 0, sum2 = 0, sum3 = 0;
for(var i = 0; i<arr.Length; i++)
{
switch (i % 4)
{
case 0: sum0 += arr[i]; break;
case 1: sum1 += arr[i]; break;
case 2: sum2 += arr[i]; break;
case 3: sum3 += arr[i]; break;
}
}
var sum = sum3+ (sum2 << 8) + (sum1 << 16) + (sum0 << 24);
return sum;
}
Интересно, как этот простой метод можно существенно улучшить и оптимизировать? Тогда читайте подробнее — вас ждет много кода и бенчмарков.
#csharp #benchmarks
Please open Telegram to view this post
VIEW IN TELEGRAM
👍11❤2🔥1
Entity Framework BulkUpdate vs SaveChange vs Manual SQL: бенчмарки производительности Entity Framework 7 bulk update
👉 Код здесь
#csharp #benchmarks by Dave Callan
👉 Код здесь
#csharp #benchmarks by Dave Callan
👍11🥱6🔥5🤔1
Немного магии JIT от Егора Богатова
🙃 Оба метода работают одинаково, но почему версия
#dotnet #benchmarks
🙃 Оба метода работают одинаково, но почему версия
_hacker
работает быстрее?#dotnet #benchmarks
🤔22🔥10👍5😁4
💡Цена случайного использования
1. Временная сложность составляет O(N*K), вместо O(N).
2. Значительно больше выделений памяти (Enumerable.Contains выделяет память под enumerator).
👉 Вот как это влияет на производительность: скорость работы в 6 раз медленнее и в 3 раза больше выделений памяти.
#dotnet #csharp #benchmarks #tip by Сергей Тепляков
Enumerable.Contains
вместо HashSet<T>.Contains
в цикле (что является довольно распространенной ошибкой):1. Временная сложность составляет O(N*K), вместо O(N).
2. Значительно больше выделений памяти (Enumerable.Contains выделяет память под enumerator).
👉 Вот как это влияет на производительность: скорость работы в 6 раз медленнее и в 3 раза больше выделений памяти.
#dotnet #csharp #benchmarks #tip by Сергей Тепляков
👍41🤔7
KeyValuePair<TK,TV>
не стоит использовать в качестве ключа хеш-таблиц, так как он не переопределяет методы Equals
/HashCode
.Это может привести к снижению производительности в 100 раз, так как хеш-код KVP будет одинаковым, если ключ и значение совпадают. Почему?
Потому что по умолчанию для blittable структур хеш-код является просто операцией XOR (^) всех полей (смотрите третий скрин).
Большое время обработки вызвано коллизиями и последовательным поиском, а также огромными выделениями памяти, связанным с упаковкой каждого экземпляра для вызова метода
Equals
.👉 Подробнее
#dotnet #csharp #performance #tip #benchmarks
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
👍23🤔6😁1
Улучшения производительности JsonSerializer в .NET 8 на практике
#dotnet #csharp #benchmarks by Dave Callan
#dotnet #csharp #benchmarks by Dave Callan
🔥28👍10💯1
Помимо
System.Text.Json
и Newtonsoft.Json
в качестве альтернативы BinaryFormatter
для серилизации/десериализации объектов в .NET можно использовать MessagePack
и MemoryPack
. Есть и другие способы, но эти работают без дополнительных настроек и показывают неплохие результаты производительности.
1️⃣
var bytes = MessagePackSerializer.Serialize(People, ContractlessStandardResolver.Options);
return MessagePackSerializer.Deserialize<List<Person>>(bytes, ContractlessStandardResolver.Options);
2️⃣
[MemoryPackable]
public partial class Person
{
public string Name { get; set; }
public int Age { get; set; }
public List<string> ProgrammingKeywords { get; set; } = [];
}
...
var bytes = MemoryPackSerializer.Serialize(People);
return MemoryPackSerializer.Deserialize<List<Person>>(bytes);
👉 Подробнее
#benchmarks #dotnet #csharp
Please open Telegram to view this post
VIEW IN TELEGRAM
👍24
string.Contains(char)
vs. string.Contains(string)
: когда производительность находишь там, где вообще не ждешь #dotnet #csharp #benchmarks #tip by Сергей Тепляков
Please open Telegram to view this post
VIEW IN TELEGRAM
🥱21👍14
Можно ли ускорить рефлексию в .NET? Да, с помощью легковесной генерации кода на основе деревьев выражений.
Выше — пример оптимизации доступа к членам путем кэширования сгенерированных выражений доступа к полям или свойствам.
Это все еще в 100 раз медленнее, чем прямой доступ. Но в 10 раз быстрее, чем обычная рефлексия!
#dotnet #csharp #benchmarks #tip by Сергей Тепляков
Выше — пример оптимизации доступа к членам путем кэширования сгенерированных выражений доступа к полям или свойствам.
Это все еще в 100 раз медленнее, чем прямой доступ. Но в 10 раз быстрее, чем обычная рефлексия!
#dotnet #csharp #benchmarks #tip by Сергей Тепляков
⚡12👍6❤1💯1
Если у вас есть критически важный участок кода, использующий LINQ, рассмотрите возможность добавления специальных перегрузок для улучшения производительности.
Читаемость немного ухудшится, но код все еще будет высокоуровневым.
#dotnet #csharp #benchmarks #tip by Сергей Тепляков
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥17👍6🎉1
🆚 Task.Run vs. TaskCompletionSource + ThreadPool.QueueUserWorkItem
Сергей Тепляков раскопал шаблон (эпохи .NET 4.0) для запуска кода в пуле потоков
#dotnet #csharp #benchmarks
Сергей Тепляков раскопал шаблон (эпохи .NET 4.0) для запуска кода в пуле потоков
#dotnet #csharp #benchmarks
👍20😁4