Насколько дорогостоящий действительно ли.NET является отражением?

Здесь вы можете найти мою мою реализацию, вы можете ограничить использование ram, изменив «буферную» переменную, есть ошибка, что программа печатает пустую строку в начале.

А также ram использование может увеличиваться, если нет новых строк для более чем байтов в буфере, переменная «утечка» будет увеличиваться до тех пор, пока не увидит новую строку («\n»).

Это также работает для 16-гигабайтных файлов, которые больше, чем моя общая память.

import os,sys
buffer = 1024*1024 # 1MB
f = open(sys.argv[1])
f.seek(0, os.SEEK_END)
filesize = f.tell()

division, remainder = divmod(filesize, buffer)
line_leak=''

for chunk_counter in range(1,division + 2):
    if division - chunk_counter < 0:
        f.seek(0, os.SEEK_SET)
        chunk = f.read(remainder)
    elif division - chunk_counter >= 0:
        f.seek(-(buffer*chunk_counter), os.SEEK_END)
        chunk = f.read(buffer)

    chunk_lines_reversed = list(reversed(chunk.split('\n')))
    if line_leak: # add line_leak from previous chunk to beginning
        chunk_lines_reversed[0] += line_leak

    # after reversed, save the leakedline for next chunk iteration
    line_leak = chunk_lines_reversed.pop()

    if chunk_lines_reversed:
        print "\n".join(chunk_lines_reversed)
    # print the last leaked line
    if division - chunk_counter < 0:
        print line_leak
204
задан Peter Mortensen 21 October 2011 в 22:49
поделиться

12 ответов

Это. Но это зависит от того, что Вы пытаетесь сделать.

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

Однако, если бы Вы отражаетесь в серии вложенных циклов с отражательными запросами к каждому, я сказал бы, что необходимо пересмотреть код:)

В течение "нескольких времен" операции, отражение совершенно приемлемо, и Вы не заметите задержки или проблемы с нею. Это - очень мощный механизм, и это даже используется.NET, таким образом, я не вижу, почему Вы не должны давать ему попытку.

128
ответ дан Martin Marconcini 23 November 2019 в 04:54
поделиться

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

2
ответ дан Chris Pietschmann 23 November 2019 в 04:54
поделиться

Как со всем, это - все об оценке ситуации. В DotNetNuke там является довольно базовым компонентом, названным FillObject, который использует отражение для заполнения объектов от datarows.

Это - довольно общий сценарий и существует статья о MSDN, Используя Отражение для Привязки Бизнес-объектов со Средствами управления Формой ASP.NET , который охватывает проблемы производительности.

Производительность в стороне, одна вещь мне не нравится приблизительно использовать отражение, в котором конкретный сценарий - то, что это имеет тенденцию уменьшать способность понять код на быстрый взгляд, который для меня не кажется стоящим усилия, когда Вы полагаете, что также теряете безопасность времени компиляции в противоположность наборам данных со строгим контролем типов или чему-то как LINQ  to  SQL.

3
ответ дан Peter Mortensen 23 November 2019 в 04:54
поделиться

Как со всеми вещами в программировании Вас должны сбалансировать стоимость производительности с с любой полученной выгодой. Отражение является неоценимым инструментом, когда используется с осторожностью. Я создал O/R отображающаяся библиотека в C#, который использовал отражение, чтобы сделать привязку. Это работало фантастически хорошо. Большая часть отражательного кода была только выполнена однажды, таким образом, любой хит производительности был довольно маленьким, но преимущества были большими. Если бы я писал новому fandangled сортировку алгоритма, я, вероятно, не использовал бы отражение, так как это, вероятно, масштабировалось бы плохо.

я ценю, что точно не ответил на Ваш вопрос здесь. Моя точка - то, что это действительно не имеет значения. Используйте отражение в соответствующих случаях. Просто другая функция языка, которую необходимо изучить, как и когда использовать.

5
ответ дан Mike Thompson 23 November 2019 в 04:54
поделиться

Отражение может оказать значимое влияние на производительность при использовании его для частого создания объекта. Я разработал приложение на основе Составной объект Блок приложений UI, который полагается на отражение в большой степени. Было значимое снижение производительности, связанное с созданием объектов через отражение.

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

3
ответ дан aku 23 November 2019 в 04:54
поделиться

Не в широком масштабе. У меня никогда не было проблемы с ним в настольной разработке, если, как Martin заявляет, Вы не используете его в глупом месте. Я услышал, что у большого количества людей есть совершенно безрассудные страхи о его производительности в настольной разработке.

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

12
ответ дан Community 23 November 2019 в 04:54
поделиться

Мой самый подходящий опыт писал код для сравнения любых двух объектов данных того же типа в мудрой свойством модели большого объекта. Получил его работа, попробовал его, работал как собака, очевидно.

я был подавлен, тогда в течение ночи понял, что wihout изменение логики, я мог использовать тот же алгоритм, чтобы автоматически сгенерировать методы для того, чтобы сделать сравнение, но статически получить доступ к свойствам. Это заняло время вообще для адаптации кода с этой целью, и у меня была способность сделать глубоко мудрое свойством сравнение объектов со статическим кодом, который мог быть обновлен при щелчке кнопки каждый раз, когда измененная объектная модель.

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

12
ответ дан Gaz 23 November 2019 в 04:54
поделиться

В его разговоре Производительность Повседневных Вещей , Jeff Richter показывает, что вызов метода отражением [приблизительно 113] в 1000 раз медленнее , чем вызов его обычно.

подсказка Jeff: если необходимо назвать метод многократно, используйте отражение однажды для нахождения его, то присвойте его делегат , и затем позвоните делегату.

149
ответ дан ESRogs 23 November 2019 в 04:54
поделиться

Это достаточно плохо, что Вы должны быть взволнованы даже об отражении, сделанном внутренне библиотеками.NET для критического по отношению к производительности кода.

следующий пример является устаревшим - верный в то время (2008), но давно зафиксированный в более свежих версиях CLR. Отражение в целом является все еще несколько дорогостоящей вещью, хотя!

Рассматриваемый вопрос: Вы никогда не должны использовать участника, объявленного в качестве "Объекта" в блокировке (C#) / оператор SyncLock (VB.NET) в высокоэффективном коде. Почему? Поскольку CLR не может соединить тип значения, что означает, что он должен сделать отражательную проверку типа во время выполнения, чтобы видеть, является ли Ваш Объект на самом деле типом значения вместо ссылочного типа.

10
ответ дан McKenzieG1 23 November 2019 в 04:54
поделиться

Если вы не зациклены, не беспокойтесь об этом.

14
ответ дан 23 November 2019 в 04:54
поделиться

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

1
ответ дан 23 November 2019 в 04:54
поделиться

Отражение обходится дорого из-за множества проверок, которые среда выполнения должна выполнять всякий раз, когда вы делаете запрос метода, который соответствует списку параметров. Где-то глубоко внутри существует код, который перебирает все методы для типа, проверяет его видимость, проверяет тип возвращаемого значения, а также проверяет тип каждого параметра. Все это требует времени.

Когда вы выполняете этот метод внутренне, есть некоторый код, который выполняет такие вещи, как проверка того, что вы передали совместимый список параметров перед выполнением фактического целевого метода.

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

3
ответ дан 23 November 2019 в 04:54
поделиться
Другие вопросы по тегам:

Похожие вопросы: