Увеличивает ли размещение объектов одного размера GC или «новую» производительность? - PullRequest
12 голосов
/ 29 декабря 2011

Предположим, нам нужно создать много небольших объектов типа байтового массива.Размер варьируется, но он всегда меньше 1024 байтов, скажем, 780,256,953 ....

Повысит ли он со временем новый оператор или эффективность GC, если мы всегда будем выделять только байты [1024] и использовать только необходимое пространство?

UPD: это недолговечные объекты, созданные для анализа сообщений двоичного протокола.

UPD: количество объектов одинаково в обоих случаях, меняется только размер выделения (случайный иливсегда 1024).

В C ++ это будет иметь значение из-за фрагментации и новой производительности C ++.Но в C # ....

Ответы [ 5 ]

9 голосов
/ 29 декабря 2011

Повысит ли это эффективность оператора или эффективность ГХ с течением времени, если мы будем всегда выделять только байты [1024] и использовать только необходимое пространство?

Может быть.Вам придется профилировать его и посмотреть.

То, как мы распределяем узлы синтаксического дерева внутри компилятора Roslyn, довольно интересно, и в конце концов я собираюсь написать в блоге об этом.А до тех пор уместным в вашем вопросе будет немного интересного.Наш шаблон распределения обычно включает в себя выделение «нижележащего» неизменяемого узла (который мы называем «зеленым» узлом) и изменяемого «фасада» узла, который обертывает его (который мы называем «красным» узлом).Как вы можете себе представить, мы часто выделяем их попарно: зеленый, красный, зеленый, красный, зеленый, красный.

Зеленые узлы постоянны и, следовательно, долговечны;фасады недолговечны, потому что они отбрасываются при каждом редактировании.Поэтому часто бывает так, что сборщик мусора имеет зеленый / дырочный / зеленый / дырочный / зеленый / дырочный, а затем зеленые узлы перемещаются вверх на поколение.

Мы всегда предполагали, что уменьшение размеров структур данных приведет квсегда улучшайте производительность GC.Меньшие структуры равняются меньшему количеству выделенной памяти, равны меньшему давлению сбора, равны меньшему количеству сборов, равны большей производительности, верно?Но благодаря профилированию мы обнаружили, что уменьшение красных узлов на меньше в этом сценарии на самом деле снижает производительность GC. Что-то особенное с размером отверстий каким-то странным образом влияет на ГХ ;не будучи экспертом по внутренним компонентам сборщика мусора, мне непонятно, почему это должно быть.

Так возможно ли, что изменение размера ваших распределений может каким-то непредвиденным образом повлиять на GC? Да, это возможно. Но, во-первых, это маловероятно , а во-вторых, невозможно узнать, находитесь ли вы в такой ситуации, пока вы на самом деле не попробуете это по-настоящему-мерные сценарии и тщательно измеряйте производительность GC .

И, конечно, вы не можете быть в курсе производительности GC.Roslyn делает так много небольших распределений, что крайне важно, чтобы мы настроили наше поведение, влияющее на сборщик мусора, но мы делаем безумное количество небольших распределений.Подавляющее большинство программ .NET не делают акцент на GC, как мы.Если вы находитесь в меньшинстве программ, которые подчеркивают ГК интересными способами, то нет никакого способа обойти это;вам придется профилировать и собирать эмпирические данные, как мы делаем в команде Roslyn.

Если вы не в том меньшинстве, то не беспокойтесь о производительности GC;у вас, вероятно, есть более серьезная проблема в другом месте, с которой вам следует иметь дело в первую очередь.

3 голосов
/ 29 декабря 2011

new быстро, это GC вызывает проблемы. Таким образом, это зависит от того, как долго живут ваши массивы.

Если они живут недолго, я не думаю, что будет какое-то улучшение от выделения 1024-байтовых массивов. Фактически это будет оказывать большее давление на ГХ из-за потерянного пространства и, вероятно, ухудшит производительность.

Если бы они жили в течение жизни вашего приложения, я бы рассмотрел выделение одного большого массива и использование его кусков для каждого маленького массива. Вам нужно будет профилировать это, чтобы увидеть, помогает ли это.

1 голос
/ 29 декабря 2011

Не совсем, для выделения или очистки байтового массива требуется только одна инструкция, независимо от ее размера.(Я говорю о вашем случае. Есть исключения)

Вам не следует беспокоиться о производительности, связанной с сборкой мусора, если вы не уверены, что это является узким местом для вашего приложения (т.е. вы создаете много ссылок ссложные отношения, и бросить их вскоре после этого ... И сборка мусора заметна.)

Чтобы прочитать отличный рассказ о хорошо известном (и довольно полезном) сайте, имеющем проблемы с производительностью .NET GC (ввпечатляющий вариант использования) см. этот блог.http://samsaffron.com/archive/2011/10/28/in-managed-code-we-trust-our-recent-battles-with-the-net-garbage-collector;)

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

0 голосов
/ 29 декабря 2011

Я не думаю, что GC будет проблемой и / или узким местом.

Выделение объектов разных размеров и освобождение их в другой последовательности может привести к фрагментации памяти кучи. Так что здесь может пригодиться размещение объектов одинакового размера.

Если вы действительно выделяете / освобождаете много и действительно видите это как свое узкое место, попробуйте повторно использовать объекты с локальным кешем объектов. Это может привести к увеличению производительности, особенно если они являются объектами только для данных, которые не реализуют много логики. Если объекты действительно реализуют много логики и требуют более сложной инициализации (RAII-паттерн), я бы отказался от повышения производительности для устойчивости программы ...

НТН

Mario

0 голосов
/ 29 декабря 2011

Я также не думаю, что только выделение 1024 байтовых массивов улучшит GC. Поскольку GC не детерминистичен, я также думаю, что это не будет вашей проблемой.

Вы можете влиять на сборщик мусора, используя операторы using {} вокруг ваших массивов, чтобы быстрее освободить память (возможно).

...