Как безопасность типа c # влияет на сборку мусора? - PullRequest
0 голосов
/ 06 января 2011

Я имею дело с кодом, который обрабатывает большие буферы (> 100 МБ), и манипулирование ими выполняется в unsafe блоках.Я хотел бы изменить их, чтобы избежать кода unsafe.Меня интересует возможное увеличение производительности памяти (положительное / отрицательное / нейтральное), прежде чем я приступлю к этому.

Я утверждаю, что если компилятор может проверять типы, он может генерировать лучший код, а это также можетхорошая производительность GC.Это правильное утверждение?Какой у тебя опыт?Спасибо.

Ответы [ 3 ]

1 голос
/ 06 января 2011

unsafe блоки - это языковая функция, а не функция CLR. Так что они на самом деле не существуют во время выполнения. То, что существует , существует во время выполнения, это закрепленные переменные, и если вы можете избежать этого, вы могли бы получить выигрыш в производительности, но это зависит от компромисса между затратами / выгодами. Поэтому не беспокойтесь о влиянии на производительность, если код не вставит в память буфер размером 100 МБ без уважительной причины.

1 голос
/ 12 января 2011

Я ожидаю отрицательное влияние. Кроме исчезновения флажка «безопасно», я не вижу никаких преимуществ удаления небезопасного кода:

  1. замена указателя доступа к массивы (я полагаю, вы используете те?) с обычными индексами массива введут массив проверка длины -> меньшая производительность . Кроме того, в большинстве ситуаций арифметика указателей - даже если она не такая быстрая, как известно из родных языков - будет самым быстрым способом доступа к вашим данным (массивам).

  2. Компилятор «знает» типы в любом случае - даже в небезопасных блоках. я не увидит шансов для этого сделать «лучший» код. Кроме того, даже «лучший» код будет влиять только производительность GC, если это приведет чтобы меньше объектов создавалось. я сомневаюсь, компилятор может избежать создание новых объектов - просто зная тип для них. -> нет улучшение либо .

  3. Аргументы о пиннинге имеют уже было сказано выше. Получение избавление от закрепленных объектов может улучшиться производительность немного - но только для небольших предметов. Не для большого объекты, которые живут на компактирование) куча больших объектов, т.к. они не будут перемещены в любом случае. -> нейтральный

1 голос
/ 06 января 2011

Это зависит от того, для чего используются ваши буферы.

Такие большие буферы будут помещены в кучу больших объектов (LOH), поэтому обязательно ознакомьтесь с этим для последствий.

В лучшем случае я бы ожидал равной производительности.

...