Какие улучшения были сделаны для операций упаковки и распаковки в CLR, если таковые имеются?

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

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

2 ответа

Решение

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

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

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

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

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

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

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

Другие вопросы по тегам