Se ha denunciado esta presentación.
Utilizamos tu perfil de LinkedIn y tus datos de actividad para personalizar los anuncios y mostrarte publicidad más relevante. Puedes cambiar tus preferencias de publicidad en cualquier momento.
Collection Classes Deep Dive        By Gary Short     Head of Gibraltar Labs      Gibraltar Software                      ...
Introduction•   Gary Short•   Head of Gibraltar Labs•   C# MVP•   @garyshort•   gary.short@gibraltarsoftare.com•   faceboo...
Why do we Care About This Stuff?                                   3
4
Let’s Start With Something We Know                                     5
List<T> Demo               6
What we Learned•   Don’t add elements in a loop•   Add causes capacity growths•   Capacity growths uses Array.Copy()•   Ar...
How Slow is Slow?                    8
Performance: Add Versus AddRange                  30000                  25000                  20000Number of Ticks      ...
What About Removing Stuff?                             10
Demo       11
What we LearnedPrefer RemoveAt() as there’s no IndexOf() step                                                 12
List<T> - Sorting•   Uses QuickSort under the hood•   Fastest general purpose sort algorithm•   O(n log n) in best case•  ...
Performance: O(n log n) Vs O(n^2)         120         100          80Effort          60                                   ...
QuickSort Demo                 15
So What is the Worst Case?• If the list is already sorted   – First partition has lower = 0, upper = n   – Then calls Part...
Can we Mitigate the Worst Case?• Median of Three  – Take an element from the “top” of the array  – Take an element from th...
Disadvantage: O(n) Add, Insert, Remove                                         19
What if we Need Fast Add, Insert & Remove?                                             20
LinkedList<T>• Double linked  – Each item points to the previous and next items  – This means it’s super fast     • Add, i...
Demo       22
Disadvantage: O(n) lookups                             23
What if we Need Fast Lookups?                                24
Dictionary<TKey, TValue>• Performance depends on key.GetHashCode()  – Hash codes must be evenly distributed across int    ...
Dictionary<TKey, TValue>• Objects used as keys must also implement  IEquatable.Equals()• Or override Equals()• Why?  – Dif...
Disadvantage: one value per key                                  27
What if I Need Multiple Values per Key?                                          28
Lookup<TKey, TElement> Demo                              29
Concurrent Collections                         30
Types of Concurrent Collections•   ConcurrentBag<T>•   ConcurrentDictionary<T>•   ConcurrentQueue<T>•   ConcurrentStack<T>...
Key Characteristics• New .Net 4.0• Guards against multi-thread collection conflicts• Implements IProducerConsumerCollectio...
Do I Have To Check Every Time?!• BlockingCollection<T>  – Blocks and waits until task completes  – Uses Add() and Take() m...
But I Don’t Want it to Wait For Ever!• So we don’t want to wait forever• Nor do we want to cancel the Add() from  outside•...
Summary• List is a good general purpose collection    – Construct to size if possible    – Construct to upper threshold th...
Questions• gary.short@gibraltarsoftware.com• @garyshort• Facebook.com/TheOtherGaryShort                                   ...
.Net Collection Classes Deep Dive  - Rocksolid Tour 2013
Próxima SlideShare
Cargando en…5
×

.Net Collection Classes Deep Dive - Rocksolid Tour 2013

1.340 visualizaciones

Publicado el

  • Sé el primero en comentar

.Net Collection Classes Deep Dive - Rocksolid Tour 2013

  1. 1. Collection Classes Deep Dive By Gary Short Head of Gibraltar Labs Gibraltar Software 1
  2. 2. Introduction• Gary Short• Head of Gibraltar Labs• C# MVP• @garyshort• gary.short@gibraltarsoftare.com• facebook.com/TheOtherGaryShort 2
  3. 3. Why do we Care About This Stuff? 3
  4. 4. 4
  5. 5. Let’s Start With Something We Know 5
  6. 6. List<T> Demo 6
  7. 7. What we Learned• Don’t add elements in a loop• Add causes capacity growths• Capacity growths uses Array.Copy()• Array.Copy() is a O(n) operation• O(n) is sloooooowwwwwww. • Use AddRange() instead• Or set “large enough” initial capacity. 7
  8. 8. How Slow is Slow? 8
  9. 9. Performance: Add Versus AddRange 30000 25000 20000Number of Ticks 15000 Add AddRange 10000 5000 0 10 100 1000 10000 100000 1000000 Number of Elements Added
  10. 10. What About Removing Stuff? 10
  11. 11. Demo 11
  12. 12. What we LearnedPrefer RemoveAt() as there’s no IndexOf() step 12
  13. 13. List<T> - Sorting• Uses QuickSort under the hood• Fastest general purpose sort algorithm• O(n log n) in best case• O(n log n) in average case• Though worst case is O(n^2)  13
  14. 14. Performance: O(n log n) Vs O(n^2) 120 100 80Effort 60 O(n log n) O(n^2) 40 20 0 1 2 3 4 5 6 7 8 9 10 Elements to be Sorted
  15. 15. QuickSort Demo 15
  16. 16. So What is the Worst Case?• If the list is already sorted – First partition has lower = 0, upper = n – Then calls Partition(n-1); – This happens a further n-2 times 16
  17. 17. Can we Mitigate the Worst Case?• Median of Three – Take an element from the “top” of the array – Take an element from the “middle” of the array – Take an element from the “bottom” of the array – Find the median value of the three – Pivot on the median• Let’s see if Microsoft uses this algorithm. 18
  18. 18. Disadvantage: O(n) Add, Insert, Remove 19
  19. 19. What if we Need Fast Add, Insert & Remove? 20
  20. 20. LinkedList<T>• Double linked – Each item points to the previous and next items – This means it’s super fast • Add, insert and remove are all O(1) operations 21
  21. 21. Demo 22
  22. 22. Disadvantage: O(n) lookups 23
  23. 23. What if we Need Fast Lookups? 24
  24. 24. Dictionary<TKey, TValue>• Performance depends on key.GetHashCode() – Hash codes must be evenly distributed across int • If two keys return hashes that give the same index – Dictionary must look for nearest free location to store item – Must search later to return the item – This hurts performance – Use your own type, then this is on you.  25
  25. 25. Dictionary<TKey, TValue>• Objects used as keys must also implement IEquatable.Equals()• Or override Equals()• Why? – Different keys may return the same hashcode – Equals() is used by the dictionary comparing keys – So you must ensure the following • If A.Equals(B) then A.HashCode() and B.HashCode() return the same HashCode() • Override Equals() but not GetHashCode() == compile error. 26
  26. 26. Disadvantage: one value per key 27
  27. 27. What if I Need Multiple Values per Key? 28
  28. 28. Lookup<TKey, TElement> Demo 29
  29. 29. Concurrent Collections 30
  30. 30. Types of Concurrent Collections• ConcurrentBag<T>• ConcurrentDictionary<T>• ConcurrentQueue<T>• ConcurrentStack<T>• OrderablePartitioner<T>• BlockingCollection<T>. 31
  31. 31. Key Characteristics• New .Net 4.0• Guards against multi-thread collection conflicts• Implements IProducerConsumerCollections<T> – TryAdd() • Tries to add item to collection returns success bool – TryTake() • Tries to remove and return item returns success bool – Returns the item in an out param.• Always check the return value before moving on. 32
  32. 32. Do I Have To Check Every Time?!• BlockingCollection<T> – Blocks and waits until task completes – Uses Add() and Take() methods • Block the thread and wait until task completes • Add() has an overload to pass a CancellationToken • Add() may also block if bounding capacity was used. 33
  33. 33. But I Don’t Want it to Wait For Ever!• So we don’t want to wait forever• Nor do we want to cancel the Add() from outside• TryAdd() and TryTake() are offered too• Where you can specify a timeout. 34
  34. 34. Summary• List is a good general purpose collection – Construct to size if possible – Construct to upper threshold then trim – Prefer AddRange() over Add() – Be aware of “Quicksort Killers”• Use LinkedList if you need fast insert/remove• Use Dictionary if you need fast lookup• Use Lookup if you need multi values• Use concurrent collections for thread safety. 35
  35. 35. Questions• gary.short@gibraltarsoftware.com• @garyshort• Facebook.com/TheOtherGaryShort 36

×