.NET кросс-сборка производительности хит - PullRequest
13 голосов
/ 29 августа 2009

Я читаю книгу Билла Вагнера Эффективный C # . В пункте 32 он призывает разработчиков создавать меньшие, более сплоченные сборки, которые могут быть более легко использованы повторно. Однако в том же пункте он говорит:

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

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

Спасибо

Ответы [ 3 ]

14 голосов
/ 29 августа 2009

Система безопасности в .NET довольно сложна. Я не уверен, что ответ так прост, как может показаться на первый взгляд. Даже если у вас есть одна сборка, проверки безопасности все еще выполняются. Когда вы запускаете приложение, имеющее всю логику в одном .exe, вы не пропускаете проверки безопасности .NET для загрузки сборки и проверки, а также не пропускаете проверки наследования типов. Однако, как только безопасность была проверена для данной области, это обычно не происходит снова (могут быть некоторые смягчающие обстоятельства, которые могут вызвать повторную проверку доказательств).

Несколько сборок не будут вести себя по-разному. Может быть некоторая дополнительная стоимость загрузки сборки и начальная стоимость доступа к типу, поскольку каждая новая сборка потребует этих первоначальных проверок безопасности. Однако эти проверки обычно бледнеют по сравнению с процессом JITting самого кода.

Помимо базовой загрузки сборки и проверок безопасности типов, у вас также могут быть явные требования к разрешениям. Microsoft. Пространства имен системы пронизаны проверками безопасности Demand и LinkDemand, которые проверяют наличие у всех вызывающих абонентов стека (требование) или непосредственного абонента (требование соединения) разрешение на выполнение вызова. (Ваш код должен также включать такие проверки, которые были бы уместны для проверки того, что вызывающие абоненты также имеют соответствующее разрешение.) Эти проверки безопасности будут выполняться независимо от того, где находится код ... локально, в другой сборке или даже в сборке в другом домене приложения. , Однако, как только вы получаете вызовы, сделанные к другим доменам или процессам приложений, или даже к сервисам и другим серверам, затраты на маршалинг этих вызовов и установление соединений становятся на порядок дороже.

Это даже не вся картина, когда речь идет о безопасности .NET. Некоторые проверки безопасности обходятся дороже, чем другие. Некоторые требуют учетных данных, другие требуют доказательств и т. Д. Безопасность - это не то, что вы можете уклониться ... это важнейший и важный компонент современной разработки программного обеспечения. Я не стал бы сильно беспокоиться о стоимости безопасности ... так как она хорошо реализована и оптимизирована в .NET Framework и CLR. Я бы приложил все усилия к тому, чтобы ваше приложение было правильно спроектировано и организовано. Если разделение кода на несколько сборок является логичным, сокращает затраты на обслуживание, развертывание и рефакторинг, тогда его ХОРОШО стоит небольших дополнительных затрат на безопасность.

4 голосов
/ 09 июля 2013

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

В один из наших классов C # поступает от нескольких сотен тысяч до 3-4 миллионов вызовов.

Не имеет значения, находится ли этот класс в той же сборке или в другой сборке, если они находятся на том же компьютере в том же процессе и домене. Я не смог измерить сколько-нибудь значительную потерю производительности!

Конечно, если нужно сортировать вызовы, все по-другому. Может быть, очень разные ...

4 голосов
/ 29 августа 2009

Эти проверки безопасности выполняются, когда CLR загружает сборку. После загрузки сборки дальнейшие проверки безопасности не требуются.

...