.NET кросс-сборка производительности хит
Я читаю книгу Билла Вагнера " Эффективный C#". В пункте 32 он призывает разработчиков создавать меньшие, более сплоченные сборки, которые могут быть более легко использованы повторно. Однако в том же пункте он говорит:
... Дополнительные проверки безопасности также выполняются через границы сборки. Весь код из одной и той же сборки имеет одинаковый уровень доверия (не обязательно одинаковые права доступа, но одинаковый уровень достоверности). CLR выполняет некоторые проверки безопасности всякий раз, когда поток кода пересекает границу сборки. Чем меньше раз ваш программный поток пересекает границы сборки, тем эффективнее он будет... Ни одна из этих проблем производительности не должна отговаривать вас разбивать сборки, которые слишком велики. Штрафы за производительность незначительны.
Мой вопрос: есть ли дополнительные проверки безопасности, выполняемые для каждого вызова метода в Foo.dll, или только при первой загрузке сборки?
Спасибо
3 ответа
Система безопасности в.NET довольно сложна. Я не уверен, что ответ так прост, как может показаться на первый взгляд. Даже если у вас есть одна сборка, проверки безопасности все еще выполняются. Когда вы запускаете приложение, имеющее всю логику в одном.exe, вы не пропускаете проверки безопасности.NET для загрузки и проверки сборки, а также не пропускаете проверки наследования типов. Однако, как только безопасность была проверена для данной области, это обычно не происходит снова (могут быть некоторые смягчающие обстоятельства, которые заставили бы повторную проверку доказательств).
Несколько сборок не будут вести себя по-другому. Может быть некоторая дополнительная стоимость загрузки сборки и начальная стоимость доступа к типу, поскольку каждая новая сборка потребует этих первоначальных проверок безопасности. Тем не менее, эти проверки, как правило, бледнеют по сравнению с процессом JITting самого кода.
Помимо проверки базовой нагрузки и проверки безопасности типов, у вас также могут быть явные требования к разрешениям. Microsoft. Пространства имен системы пронизаны проверками безопасности Demand и LinkDemand, которые проверяют наличие у всех вызывающих абонентов стека (требование) или непосредственного абонента (требование соединения) разрешение на выполнение вызова. (Ваш код должен также включать такие проверки, которые были бы пригодны для проверки того, что вызывающие абоненты также имеют соответствующее разрешение.) Эти проверки безопасности будут происходить независимо от того, где код находится... локально, в другой сборке или даже в сборке в другом домене приложения., Однако, как только вы получаете вызовы, сделанные к другим доменам приложений или процессам, или даже к сервисам и другим серверам, затраты на маршалинг этих вызовов и установление соединений становятся на порядок дороже.
Это даже не полная картина, когда речь заходит о безопасности.NET. Некоторые проверки безопасности обходятся дороже, чем другие. Некоторые требуют учетных данных, другие требуют доказательств и т. Д. Безопасность - это не то, что вы можете уклониться... это важнейший и важный компонент современной разработки программного обеспечения. Я бы не стал так сильно беспокоиться о стоимости безопасности... так как она хорошо реализована и оптимизирована в.NET Framework и CLR. Я бы приложил все усилия к тому, чтобы ваше приложение было правильно спроектировано и организовано. Если разделение кода на несколько сборок является логичным, сокращает затраты на обслуживание, развертывание и рефакторинг, то его ХОРОШО стоит небольших дополнительных затрат на безопасность.
Я также прочитал отрывок из книги Билла Вагнера, и у меня были те же сомнения по поводу производительности, поэтому я сравнил приложение, которое мы сейчас разрабатываем:
В один из наших классов C# поступает от нескольких сотен тысяч до 3-4 миллионов звонков.
Не имеет значения, находится ли этот класс в той же сборке или в другой сборке, если они находятся на одном компьютере в одном процессе и домене. Я не мог измерить сколько-нибудь значительную потерю производительности
Конечно, если нужно маршалировать звонки, все по-другому. Может быть, очень разные...
Эти проверки безопасности выполняются, когда CLR загружает сборку. После загрузки сборки дальнейшие проверки безопасности не требуются.