Какие улучшения производительности были сделаны для операций упаковки и распаковки в CLR, если таковые имеются? - PullRequest
4 голосов
/ 14 октября 2011

Я присутствовал на семинаре несколько месяцев назад, и оратор заявил, что с .NET 1.1 общая стоимость операций по упаковке или распаковке была снижена.Я просмотрел свои (плохие) заметки и не могу определить, ссылается ли это утверждение на инструкции box и unbox, или на введение классов (т. Е. Универсальных типов), которые делают бокс / распаковку менее вероятными.

Произошло ли улучшение производительности в инструкциях CLR, касающихся бокса, между .NET 1.1 и .NET 4.0, и если да, то где я могу найти информацию об измерениях, которые показывают усиление?

Ответы [ 2 ]

6 голосов
/ 14 октября 2011

Я не могу комментировать производительность (для этого вам понадобится профилирование и т. Д.), Но одно интересное изменение здесь - это ограниченный код операции, который используется в частности с дженериками. Преимущество здесь в том, что для такого метода, как:

static void DoSomething<T>(T x, T y) where T : IComparable<T>
{
    if(x.CompareTo(y) < 0) { /* whatever */ }
}

он будет использовать ограниченный вызов для CompareTo, что позволяет ему либо использовать статический вызов реализации метода для типа значения (без unbox), либо использовать виртуальный -вызовите, если это ссылочный тип. Обычно для вызова метода на основе интерфейса для типа значения требуется поле, поэтому это очень полезно.

1 голос
/ 14 октября 2011

Бокса и распаковки следует избегать в максимально возможной степени.От MSDN :

Лучше избегать использования типов значений в ситуациях, когда они должны быть упакованы большое количество раз, например в классах неуниверсальных коллекций, таких как System.Collections :: ArrayList.Вы можете избежать упаковки типов значений, используя общие коллекции, такие как System.Collections.Generic :: List.Бокс и распаковка являются вычислительно дорогостоящими процессами.Когда тип значения упакован, необходимо создать совершенно новый объект.Это может занять до 20 раз больше времени, чем простое задание.При распаковке процесс приведения может занять в четыре раза больше времени, чем назначение.

MS сделали все возможное, чтобы минимизировать стоимость самих операций бокса, но есть только так много, что можно сделать.

НАМНОГО лучшего улучшения производительности можно достичь, исключив как можно больше бокса из кода.Избегание нестандартных контейнеров - ОЧЕНЬ эффективный способ массового сокращения бокса.Возможность использовать универсальные контейнеры является одним из основных преимуществ перехода с NETFX 1.1 на 2.0 +.

...