问题标签 [ngen]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
3 回答
1136 浏览

nsis - 从 NSIS 安装程序调用 ngen

我正在使用 NSIS 部署一个 .Net 应用程序。安装/卸载过程运行良好,但我想添加最后一个 ngen 步骤以提高启动性能。

不幸的是,谷歌没有透露任何相关材料。以前不太可能没有人这样做过 - 也许这里有人有一些想法?

在不太可能的情况下,如果没有丑陋的 hack 就无法支持,我愿意使用不同的安装程序技术,只要它可以在我的 Linux 构建服务器上运行。(例如,这排除了 WiX。)

有任何想法吗?

0 投票
1 回答
1286 浏览

asp.net - ASP.NET 应用程序的启动非常慢

我有一个页面数量很少的 ASP.NET 应用程序。我看到的问题是启动时间很慢。据我所知,大部分时间都花在了 JIT 上。预编译应用程序似乎对减少通过 PerfMon 报告的#methods JIT 没有多大帮助。有人知道我可以做些什么来进一步减少启动时间吗?真的没有办法使用 NGEN 来预置 ASP.NET 应用程序吗?

0 投票
1 回答
532 浏览

.net-3.5 - 为什么 NGEN 应该挂起并且永远不会完成特定程序集的任何原因?

我有一个使用 Visual Studio 2008 构建的 .NET 3.5 类库项目。

如果我尝试在此解决方案文件中对核心程序集进行 NGEN,NGEN 永远不会完成,或者至少在我费心让它运行的时候(比如一夜之间)不会完成。

有没有其他人经历过这个?如果是这样,你解决了吗?如果你这样做了,怎么做?你采取了哪些步骤?

如果这是 NGEN 中的错误,我如何将其发布到 Microsoft?我有一个连接帐户,但是我在哪里发布此特定产品的错误报告,而不是 .NET 类(我知道该去哪里。)

有问题的类库可以在这里找到:

有问题的程序集是 LVK.Core 程序集。

更新:.NET 4.0 的 NGEN 已完成,但花了将近 15 分钟才完成:

更新 #2:在Microsoft Connect中创建问题。

0 投票
2 回答
490 浏览

.net - 如何衡量在 NGen 之前正确地重新设置 .NET 程序集的效果?

我们的应用程序有很多 .NET 程序集,到目前为止,还没有使用 NGen 脚本部署这些程序集,因此它们总是在运行时进行 JIT 处理。

由于我们的应用程序通常部署到终端服务器,让 Windows 共享代码的二进制图像可能比当前的方式更优化,所以我正在研究设置基地址和 NGen'ning 程序集。

所以我在没有任何 NGen 的情况下运行该程序,并使用 [来自 SysInternals 的 listdlls][1] 来查找每个的大小,然后我将其增加到下一类大小(即 xxxx --> 10000)。然后我为我们所有的程序集列出了一个内存列表,并调整了它们的基地址。

到目前为止一切顺利,listdlls我现在可以看到我们的程序集都没有在运行时重新设置基础。

但是,如何测量两个实例之间实际共享的内存量?基本上,假设我在未对程序集执行 NGEN 的情况下启动程序的两个实例,然后在执行 NGEN 后再次执行。

我应该查看什么样的数字,从哪个工具中找到实际效果(如果有的话)?

例如,我知道重新定位我们的程序集的行为可能会移动我们使用的第 3 方程序集(例如 DevExpress 组件),因此它们突然必须重新定位,然后整个事情就是洗牌。

那么,我从哪里读取哪些数字?比如,我是否使用任务管理器的工作集?私人记忆?提交大小?之前和之后的空闲内存?

有什么建议吗?

0 投票
1 回答
301 浏览

.net - VS2010 分析器似乎无法解析来自 ngen 图像的符号

我通过在“采样”模式下附加到 Windows 服务来分析它。

我打开结果文件,“函数”视图,我看到“最热门”函数显示为[System.Runtime.Serialization.ni.dll]没有指示此程序集中的具体 .net 函数。

看起来来自 ngen 的程序集 (.ni.dll) 的所有其他符号都以相同的方式显示。此外,我在列表中看不到任何来自托管但不是 ngen 的程序集的符号,这很奇怪。

但是,所有本机符号都可以解析,例如“AwareLock::Contention(int)”等。

此外,输出选项卡显示:

另外,我还没有启动vsperfclrenv,但是在并发分析模式下一切都解决了,所以我认为我不需要vsperfclrenv,因为VS2010为我做了一切。

我试过跑步ngen update /debug /profile,但它没有改变任何事情。

如何设置我的环境,以便 VS2010 的采样分析器解析这些托管程序集中的符号?

同时,我会尝试ngen uninstall使用它们。

0 投票
3 回答
1047 浏览

.net - ngen 是否用于将 .NET 代码编译成在运行代码时不需要安装 .NET 框架的二进制文件?

我阅读了有关 CLR 的 Wikipedia 文章中的以下段落:

或者,可以使用本机映像生成器 (NGEN) 在运行前的单独步骤中将 CIL 代码编译为本机代码。由于不再需要 CIL 到本机编译,因此这加快了软件的所有后续运行。

这是否意味着我可以使用任何 .NET 程序并将其编译为二进制文件,然后才能在未安装 .NET 框架的机器上运行?

0 投票
3 回答
1918 浏览

c# - NGEN 处理 .NET 应用程序是否有助于保护它免受逆向工程?如果没有,我什么时候使用它?

如果 Ngen 不保护我的应用程序,我什么时候可以合理地期望在我的职业生涯中使用这个应用程序?

0 投票
3 回答
725 浏览

.net - 如何防止 NGEN 对我的代码进行变基(对性能产生负面影响)?

我只是想加快基于 .NET 的客户端应用程序的速度,并正在考虑对代码进行 NGEN 处理。

Jeffery Richter写了这个关于 ngening 代码的警告:

• 较差的加载时间性能(变基)。当 Windows 加载一个 NGend 文件时,它会检查文件是否在其首选基地址加载。如果文件无法在其首选基地址加载,则 Windows 会重新定位文件,修复所有内存地址引用。这是非常耗时的,因为 Windows 必须将整个文件加载到内存中并修改文件中的各个字节。有关变基的更多信息,请参阅我的书:Programming Applications for Microsoft Windows, 4th Edition (Microsoft Press)。

由于我对这个主题了解不多,在我开始更改项目中的设置之前我应该​​知道什么,我应该更改哪些设置?

0 投票
1 回答
315 浏览

xslt - 预编译的 XSLT、ReBase 和 NGEN

高级性能问题在这里。这是我的场景:

我有一个包含数千个 XSLT 文档的数据库。一个用于网站的每个页面,因此这些将 XML 转换为 HTML。ASP.NET Web 服务器(场)从数据库加载 XSLT 文档,并使用它们为每个 Web 请求呈现 HTML。

我已经实现了使用 XslCompiledTransform 的优化并在数据库刷新之间缓存它(每 30 分钟)。我希望通过使用 xsltc.exe 将 XSLT 预编译为 DLL 来进一步提高性能。这应该消除 XslCompiledTransform 创建的所有动态方法调用。

因此,我有一个单独的服务器将 XSLT 写入文件并使用 xsltc.exe 运行它们。大约需要 20 分钟,但没关系。然后我将 DLL 放到每个网络服务器上。现在我可以让网络服务器根据需要动态加载 DLL。这是我用来将程序集加载到 XslCompiledTransform 中的代码:

我应该 ReBase.exe 目录中的 DLL 和/或 NGEN.exe 它们吗?ReBase 大约需要 5 分钟,而带有 /queue 的 NGEN.exe 大约需要 10 分钟,在此期间 CPU 会受到重击 - 可能会影响网络服务器的流量服务功能。考虑到我如何通过从程序集中读取字节来加载程序集,是否会引用本机 NGEN 图像,或者 JIT 是否会启动?

对此的任何/所有见解将不胜感激!

马尔科姆

0 投票
1 回答
682 浏览

.net - 如何在不指定域中立性的情况下将 .net 本机映像 (NGEN) 加载到多个 appdomains 中?

NGEN + AppDomain 问题在这里。

我正在进行一些应用程序更改,这些更改围绕使本机图像正确加载以防止在我们的 .net 应用程序中出现糟糕的 JIT 时间。有些部分很简单,但是任何必须在 appdomains 中加载的程序集(我们的应用程序由于各种原因必须使用它)只会在第一次加载它们的本机图像,并且在后续加载时(现在是新的 appdomain)图像被拒绝并发生 JIT。

我知道所有关于域中性加载的知识,并且已经在我们的一些程序集中使用了它,但这样做是为了消除域中性加载首先对我们来说使用 appdomains 的主要原因之一——因为永远无法卸载域中性图像。

简而言之,我需要一种方法来加载本机图像和卸载程序集。我曾希望,只要我在尝试再次加载本机映像之前卸载第一次使用的本机映像,就不会适用正常限制,但这会导致拒绝,就像尝试同时加载本机映像一样。

这篇 MSDN 文章包含以下引用:

回退到 JIT 编译的另一种方法是将本机映像的不同副本加载到每个 AppDomain 中,该 AppDomain 将相应的程序集加载为特定于域的程序集。但是,这种方法需要 NGen 映像的每个副本(第一个除外)都加载到与其首选基地址不同的地址。因此,NGen 映像的所有这些副本都需要修复它们的地址。

这对我的需求来说是完美的,但那篇文章是我见过的唯一提到它的地方,我不确定它会如何实现。

在此先感谢您的任何见解,并感谢您的关注。