dew*_*ald 13 .net c# performance assemblies
我正在阅读Bill Wagner的书" Effective C#".在第32项中,他主张开发人员创建更小,更有凝聚力的组件,可以更容易地重用.然而,在同一个项目中,他说:
...额外的安全检查也是在装配边界上完成的.来自同一程序集的所有代码具有相同的信任级别(不一定是相同的访问权限,但具有相同的真实级别).每当代码流穿过程序集边界时,CLR都会执行一些安全检查.程序流程跨越程序集边界的次数越少,效率就越高......这些性能问题都不能阻止您分解太大的程序集.性能处罚很轻微.
我的问题是,是否对Foo.dll中的每个方法调用执行了额外的安全检查,还是仅在第一次加载程序集时执行?
谢谢
jri*_*sta 14
.NET中的安全系统非常复杂.我不确定答案是否像初看起来那样简单.即使您只有一个程序集,仍然会执行安全检查.当您在单个.exe中启动具有所有逻辑的应用程序时,您不会绕过.NET安全检查以进行程序集加载和验证,也不会绕过类型继承检查.但是,一旦针对给定范围验证了安全性,通常不会再次发生(可能存在一些缓解情况会导致重新验证证据.)
多个程序集的行为不会有任何不同.可能存在一些额外的装配负载成本和初始类型访问成本,因为每个新装配将需要那些初始安全检查.但是,与JIT代码本身的过程相比,这些检查通常会很苍白.
除了基本的程序集加载和类型安全检查之外,您还可能有明确的权限要求.微软系统命名空间充满了Demand和LinkDemand安全检查,可以验证堆栈上的所有呼叫者(需求)或直接呼叫者(链路需求)是否有权进行呼叫.(您的代码也应该包括这样的检查,以确认调用者也具有适当的权限.)无论代码位于何处,本地,在另一个程序集中,甚至在另一个应用程序域的程序集中,都会发生这些安全检查. .但是,一旦您接到对其他应用程序域或进程,甚至服务和其他服务器的调用,编组这些调用和建立连接的开销就会高出几个数量级.
在.NET安全性方面,这甚至都不是全部.一些安全检查比其他安全检查更昂贵.有些需要凭证,有些则需要证据等.安全性不是你可以推卸的东西......它是现代软件开发的重要组成部分.我不会太担心安全性的成本......因为它在.NET框架和CLR中得到了很好的实现和优化.我会尽力确保您的应用程序正确构建和组织.如果将代码分成多个程序集是合乎逻辑的,减少了维护,部署和重构工作,那么它的安全性值得花费额外的小额成本.
我也读过 Bill Wagner 书中的一段话,对性能也有同样的怀疑,所以我对我们目前正在开发的应用程序进行了基准测试:
我们的 C# 类之一有数十万到 3-400 万次调用。
如果此类位于同一个程序集中或另一个程序集中,只要它们位于同一台机器上的同一进程和域中,就没有什么区别。我无法测量任何显着的性能损失!
当然,如果需要整理调用,情况就不同了。也许很不一样...