Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/284.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# GAC vs JIT_C#_.net_Optimization_Gac - Fatal编程技术网

C# GAC vs JIT

C# GAC vs JIT,c#,.net,optimization,gac,C#,.net,Optimization,Gac,GAC下的所有内容是否都已预编译(NGEED)?如果是这样,那么所有的.NET都是预编译的,所以CLR不可能在运行时优化它们 比如,如果你在应用程序中使用列表,那么CLR将无法优化列表本身,而只能优化它在应用程序中的使用方式?这不是违背了JIT在运行时获得大量优化的目的吗?因此,实际上失去了BCL的所有潜在优化?不,GAC不会自动预JIT;然而,GAC是预JIT的先决条件。事实上,只有一小部分事情是预先紧张的。除此之外-如果BCL是预JIT的,那么这些优化将已经由NGEN进行了,因此“丢失所有潜

GAC下的所有内容是否都已预编译(NGEED)?如果是这样,那么所有的.NET都是预编译的,所以CLR不可能在运行时优化它们


比如,如果你在应用程序中使用列表,那么CLR将无法优化列表本身,而只能优化它在应用程序中的使用方式?这不是违背了JIT在运行时获得大量优化的目的吗?因此,实际上失去了BCL的所有潜在优化?

不,GAC不会自动预JIT;然而,GAC是预JIT的先决条件。事实上,只有一小部分事情是预先紧张的。除此之外-如果BCL是预JIT的,那么这些优化将已经由NGEN进行了,因此“丢失所有潜在优化”不是问题。

否,全局程序集缓存没有预编译


较新版本的框架确实有一个在后台运行的优化服务,该服务执行一些预编译。但是,当它在目标系统上运行时,它所做的所有预编译都针对该特定系统进行了优化。

如果从GAC加载程序集,则跳过强名称验证,因为该程序集已经过验证。GAC的另一个优点是文件保护(仅限管理员)

NGEN有自己的本地映像存储。使用NGEN而不首先在GAC中放置程序集是有点道理的。在这种情况下,加载程序集将导致验证其SN签名,这意味着每次加载程序集时都会重新创建加密哈希


使用ngen时的最佳实践是将程序集也放在GAC中。

GAC可以包含非ngen代码(使用ngen时必须包含它以及本机映像,因为ngen映像不包含所有需要的元数据)。Ngen代码要求在GAC中安装dll才能有效运行(从技术上讲,您可以不用安装dll,但最终的名称验证会触发dll的完全读取,这可能会使您的启动时间变得更糟)

在3.5SP1之前,ngen编译与运行时编译完全不同,更多细节请参见。我想这对3.5SP1仍然适用,因为这些问题很难解决

既然NGEN真的给了你两个大的胜利,你应该考虑在你的场景中,这两个都是重要的,以证明其使用的复杂性和成本。
  • 这些dll的启动时间大大缩短
    • 这是一个巨大的胜利,尽管在启动时加载的所有DLL都需要重新设置,以避免加载jit本身的开销)
  • 本机映像可以跨多个进程共享内存空间。
    • 如果您只运行一个或两个进程,那么这是毫无意义的

  • 我认为这是一本很好的读物,它涵盖了硬绑定之类的内容,这是一个很大的改进,并且链接到了关于编写高效托管代码的优秀通用文档中,尽管它遇到了链接腐烂的问题。(请注意,该文档很旧,但许多主题仍然有效)

    谢谢Marc。实际上我不知道prejit。prejit==ngen吗?如果是这样,您仍然有运行时优化?是的;同样的事情。您将它们称为“运行时优化”的唯一原因是,它们通常会及时发生(即在运行时)。NGEN的全部目的是提前完成这项工作以减少开销。谢谢Marc。那么,可以安全地说,使用当前的CLR JIT,在运行时无法获得任何优化,而使用ngen无法提前捕获这些优化吗?Joan事实并非如此(请参阅我答案中的链接文章)还要注意的是,MS将来可能会开始做“热点”式的jitting,因为有各种类型的代码从这种优化中获益匪浅。在4.0 ThoughtBest practice中看不到这一点吗?广汽?对于大多数常见场景,最佳做法是不使用GAC,而只使用每个项目的文件副本,允许xcopy/robocopy部署。@Marc:您如何证明这一观点?GAC不是一种部署机制,而是一个版本控制/发现系统。我一直很生气,你不得不用它来发泄。Marc完全正确,很抱歉误解了你:正如你所看到的,我并没有说你必须要NGEN,我只是说没有GAC的NGEN是没有意义的。“使用ngen的最佳实践是将组件也放在GAC中”。使用GAC是应用程序应该尽量避免的,共享库或框架是更好的候选对象,但即使如此,他们也应该考虑允许一个简单的“从您的私有bin路径”加载DLL模型。