В общих чертах, существуют некоторые фундаментальные факторы, определяющие производительность упаковки и распаковки в среде сбора мусора.
Допустим, мы говорим о 64-разрядном целом числе (например, long
в C #).) на машине x64.Предположим далее, что это происходит внутри виртуальной машины, основанной на стеке, с использованием трассировки сборки мусора.
Во-первых, существует стоимость перемещения любого объема памяти из одного места в другое.Среда выполнения должна скопировать фактическое значение целого в штучной упаковке в стек, чтобы мы могли сделать что-то полезное с ним.Аналогично, в обратном случае он должен скопировать значение из стека в кучу (где хранятся ссылочные типы).Это довольно сложная операция, которая затрагивает многие подсистемы оборудования.Насколько нам известно, можно считать, что этот фактор имеет фиксированную стоимость, одинаковую для обеих операций.
Во-вторых, в случае с боксом ссылочный тип должен быть выделен в куче, что будетдержать нашу ценностьЭто включает в себя достаточное количество служебных операций, таких как поиск резервной памяти, запись соответствующего заголовка объекта в память, а также значение самого нашего целого числа.
В-третьих, в случае распаковки среде выполнения может потребоватьсявыполнить проверку типа, чтобы определить, является ли операция распаковки на самом деле законной и даст ли правильный результат.В некоторых случаях может быть возможно статически вывести тип объекта, который необходимо распаковать, но это оптимизация компилятора (или функция системы типов), а не прямая связь с выполняемой нами операцией.
* 1011В-четвертых, скрытая долгосрочная стоимость нашего упакованного целого числа состоит в том, что он, как и любой другой ссылочный тип, должен участвовать в сборке мусора.Это означает, что ссылки на него, возможно, должны быть записаны, они должны быть отслежены для определения жизнеспособности и, возможно, должны быть скопированы в другое поколение.Хотя это, конечно, верно для всех ссылочных типов, это фактор, который необходимо учитывать, если мы думаем о производительности на этом уровне.
Таким образом, стоимость зависит от ряда специфических для версии поведения компилятора., время выполнения, а также, конечно, оборудование, на котором мы работаем.Поэтому нелегко дать прямой ответ.