Библиотека шарписта | C#, F#, .NET, ASP.NET
22.9K subscribers
2.26K photos
36 videos
85 files
4.42K links
Все самое полезное для C#-разработчика в одном канале.

По рекламе: @proglib_adv

Учиться у нас: https://proglib.io/w/b60af5a4

Для обратной связи: @proglibrary_feeedback_bot

РКН: https://gosuslugi.ru/snet/67a5c81cdc130259d5b7fead
Download Telegram
🤔 Newtownsoft vs System.Text.Json

Как вам производительность встроенного инструмента для сериализации и десериализации JSON?

#csharp #benchmarks by Nabi Karampoor
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥55👍5🥱41
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
👍112🔥1
Entity Framework BulkUpdate vs SaveChange vs Manual SQL: бенчмарки производительности Entity Framework 7 bulk update

👉 Код здесь

#csharp #benchmarks by Dave Callan
👍11🥱6🔥5🤔1
Немного магии JIT от Егора Богатова

🙃 Оба метода работают одинаково, но почему версия _hacker работает быстрее?

#dotnet #benchmarks
🤔22🔥10👍5😁4
💡Цена случайного использования 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
🔥28👍10💯1
🧰 Замена BinaryFormatter в .NET 8

Помимо 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 Сергей Тепляков
12👍61💯1
💡 Все винят LINQ в низкой производительности, но это не всегда так!

Если у вас есть критически важный участок кода, использующий 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
👍20😁4