Содержание
- 2. Зачем нужна производительность?
- 3. Как понять, на каком уровне проблема?
- 4. Инструменты dotTrace dotMemory BenchmarkDotNet Visual Studio profiler CodeTrack CLR Profiler
- 5. Инструменты BenchmarkDotNet CodeTrack CLR Profiler
- 6. Инструменты Performance Monitor
- 7. Инструменты ETW Windows Performance Analyzer
- 8. Инструменты MS Message Analyzer
- 9. Lock-free & Wait-free
- 10. Lock-free & Wait-free
- 11. Lock-free & Wait-free double CompareExchange (ref double location1, double value, double comparand); Compare and Swap Interlocked
- 12. ConcurrentDictionary
- 13. ConcurrentDictionary Сильная деградация при попытке получить все блокировки
- 14. SIMD Single instruction, Multiple data float[] values = GetValues(); float increment = GetIncrement(); for (int i
- 15. SIMD Single instruction, Multiple data
- 16. Task.Yield async Task LongRunningCpuBoundWorkAsync() { for (int i = 0; i != 1000000; ++i) { ...
- 17. Task.Yield async Task LongRunningCpuBoundWorkAsync() { for (int i = 0; i != 1000000; ++i) { ...
- 18. Long switch-case switch (packetID) { case BncsPacketId.Null: break; case BncsPacketId.EnterChat: string ecUniqueName = pck.ReadNTString(); string ecStatstring
- 19. Long switch-case Dictionary > switch (packetID) { case BncsPacketId.Null: break; case BncsPacketId.EnterChat: string ecUniqueName = pck.ReadNTString();
- 20. GC Клиентский режим Серверный режим
- 21. ConcurrentBag Оптимизация потребления памяти
- 22. async/await
- 23. async/await
- 24. async/await
- 25. async/await Task.FromResult(0) Task.CompletedResult .Net 4.6
- 26. Аллокация на стеке .net core 2.1 Span C# 7.2 int* block = stackalloc int[100]; Span span
- 27. JIT оптимизация [AggressiveInlining] спасет всех Generic типы инлайнятся Типичные заблуждения: Компилятор умный internal static class FreeObjectUtils
- 28. JIT оптимизация [AggressiveInlining] спасет всех Generic типы инлайнятся Типичные заблуждения: Компилятор умный internal static class FreeObjectUtils
- 29. JIT оптимизация [AggressiveInlining] спасет всех Generic типы инлайнятся Типичные заблуждения: Компилятор умный internal static class FreeObjectUtils
- 30. JIT оптимизация public Dictionary(IEqualityComparer comparer); public struct LongEqualityComparer : IEqualityComparer { public static readonly IEqualityComparer BoxedInstanceInt64
- 31. JIT оптимизация [MethodImpl(MethodImplOptions.AggressiveInlining)] public void Clear() { if (typeof(T) == typeof(int) || typeof(T) == typeof(uint) ||
- 32. MemoryStream
- 33. MemoryStream
- 34. MemoryStream То же самое для: List Collection Dictionary и прочих коллекций
- 35. struct[] -> IList int[] a = new int[10]; DoSomething(a); public void DoSomething (IList list) { }
- 36. LINQ // [18 7 - 18 80] IL_000e: ldarg.0 // this IL_000f: call instance class [mscorlib]System.Collections.Generic.IEnumerable`1
- 37. LINQ public IEnumerable FindChildren(Guid parentId) { return this.AllParts.Where(part => part.ParentGuid == parentId).ToList(); } public IEnumerable FindChildren(Guid
- 38. LINQ public IEnumerable FindChildren(Guid parentId) { return this.AllParts.Where(part => part.ParentGuid == parentId).ToList(); } public IEnumerable FindChildren(Guid
- 39. Строки Вместо конкатенаций используй StringBuilder Вместо string.Format используй конкатенацию string first = "first"; string second =
- 40. Boxing public void Info(params object[] args) log.Info(1, 2, 3, 4, 5); Как надо? public static void
- 41. Heap Allocation Viewer
- 42. Почитать? Federico Lois Sasha Goldstein Андрей Акиньшин
- 44. Скачать презентацию