Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Андрей Михайлов «Оптимизация Generics, которая ...

DotNetRu
February 13, 2020

Андрей Михайлов «Оптимизация Generics, которая не работает»

Поглядим внутренности Generics: посмотрим оптимизации CLR и узнаем что может пойти не так. Разберем интересный случай сломавшейся оптимизации, который был поднят на Github.

DotNetRu

February 13, 2020
Tweet

More Decks by DotNetRu

Other Decks in Programming

Transcript

  1. class BaseClass<T> { private List<T> _list = new List<T>(); public

    BaseClass() { Enumerable.Empty<T>(); } public void Run() { for (var i = 0; i < 8000000; i++) { if (_list.Any()) { return; } } } }
  2. class BaseClass<T> { private List<T> _list = new List<T>(); public

    BaseClass() { Enumerable.Empty<T>(); } public void Run() { for (var i = 0; i < 8000000; i++) { if (_list.Any()) { return; } } } } class DerivedClass : BaseClass<object> { }
  3. class GenericClass<int> { private int _value; public int GetValue() {

    return _value; } } class GenericClass<long> { private long _value; public long GetValue() { return _value; } }
  4. class GenericClass<int> { private int _value; public int GetValue() {

    return _value; } } class GenericClass<long> { private long _value; public long GetValue() { return _value; } }
  5. class GenericClass<int> { private int _value; public int GetValue() {

    return _value; } } class GenericClass<long> { private long _value; public long GetValue() { return _value; } }
  6. int GetValue() { return _value; } long GetValue() { return

    _value; } class GenericClass<int> { private int _value; public int GetValue() { return _value; } } class GenericClass<long> { private long _value; public long GetValue() { return _value; } }
  7. class GenericClass<string> { private string _value; public string GetValue() {

    return _value; } } class GenericClass<object> { private object _value; public object GetValue() { return _value; } }
  8. class GenericClass<string> { private string _value; public string GetValue() {

    return _value; } } class GenericClass<object> { private object _value; public object GetValue() { return _value; } }
  9. class GenericClass<string> { private string _value; public string GetValue() {

    return _value; } } class GenericClass<object> { private object _value; public object GetValue() { return _value; } }
  10. __Canon GetValue() { return _value; } class GenericClass<string> { private

    string _value; public string GetValue() { return _value; } } class GenericClass<object> { private object _value; public object GetValue() { return _value; } }
  11. class GenericClass<T> { void Foo() { Enumerable.Empty<T>(); } } lass

    GenericClass<__Canon> { void Foo() { Enumerable.Empty<__Canon>(); } }
  12. class GenericClass<T> { void Foo() { Enumerable.Empty<T>(); } } lass

    GenericClass<__Canon> { void Foo() { Enumerable.Empty<__Canon>(); } }
  13. class GenericClass<T> { void Foo() { Enumerable.Empty<T>(); } } lass

    GenericClass<__Canon> { void Foo() { Enumerable.Empty<__Canon>(); } }
  14. class BaseClass<T> { private List<T> _list = new List<T>(); public

    BaseClass() { Enumerable.Empty<T>(); } public void Run() { for (var i = 0; i < 8000000; i++) { if (_list.Any()) { return; } } } }
  15. class BaseClass<T> { private List<T> _list = new List<T>(); public

    BaseClass() { Enumerable.Empty<T>(); } public void Run() { for (var i = 0; i < 8000000; i++) { if (_list.Any()) { return; } } } }
  16. class BaseClass<T> { private List<T> _list = new List<T>(); public

    BaseClass() { Enumerable.Empty<T>(); } public void Run() { for (var i = 0; i < 8000000; i++) { if (_list.Any()) { return; } } } }
  17. class BaseClass<T> { private List<T> _list = new List<T>(); public

    BaseClass() { Enumerable.Empty<T>(); } public void Run() { for (var i = 0; i < 8000000; i++) { if (_list.Any()) { return; } } } }
  18. class BaseClass<T> DerviedClass { private List<T> _list = new List<T>();

    public BaseClass() { Enumerable.Empty<T>(); } public void Run() { for (var i = 0; i < 8000000; i++) { if (_list.Any()) { return; } } } }
  19. class BaseClass<T> DerviedClass { private List<T> _list = new List<T>();

    public BaseClass() { Enumerable.Empty<T>(); } public void Run() { for (var i = 0; i < 8000000; i++) { if (_list.Any()) { return; } } } }
  20. class BaseClass<T> DerviedClass { private List<T> _list = new List<T>();

    public BaseClass() { Enumerable.Empty<T>(); } public void Run() { for (var i = 0; i < 8000000; i++) { if (_list.Any()) { return; } } } }
  21. class BaseClass<T> DerviedClass { private List<T> _list = new List<T>();

    public BaseClass() { Enumerable.Empty<T>(); } public void Run() { for (var i = 0; i < 8000000; i++) { if (_list.Any()) { return; } } } }
  22. class BaseClass<T> DerviedClass { private List<T> _list = new List<T>();

    public BaseClass() { Enumerable.Empty<T>(); } public void Run() { for (var i = 0; i < 8000000; i++) { if (_list.Any()) { return; } } } }