是否有一种简单的方法可以预先JIT编写C#代码,而不是等待第一次调用代码? 我读过NGEN,但我认为这不会对我有所帮助。

我的应用程序等待并响应来自UDP端口的特定外部事件,并且没有关键路径代码(a)在事件到达之前运行,或者(b)再次运行,因此JIT的成本很高在这种情况下。 使用ANTS分析器检查JIT的开销约为40-50%,有时甚至高达90%。 我的应用程序对延迟非常敏感,每毫秒都很重要。

我最初的想法是,我可以为每个关键路径方法添加一个bool参数,并在事件发生之前调用这些方法,以便启动JIT编译。 但是,是否有更漂亮,更少hacky的方式?

非常感谢

===============>>#1 票数:6 已采纳

我会说使用NGEN,如果它不起作用,你可能会有更深层次的问题。

但是,要回答你的问题,这篇关于如何预jit的文章使用System.Runtime.CompilerServices.RuntimeHelpers.PrepareMethod来强制一个JIT。 它包含使用反射来获取方法句柄的示例代码。

===============>>#2 票数:3

第二次活动到来会发生什么? 是慢还是慢? 如果它仍然很慢,那么JIT不是问题,因为代码在第一次运行时只被“JIT”编辑一次。

NGEN会为您提供答案。 我的建议是尽可能少地使用你需要的代码,如果你愿意的话,把它放在虚拟/沙箱项目中。 开始分析/ NGenning此代码并查看性能。

如果这个极少的代码,即使在NGEN'ed多次调用后表现不佳,那么预编译也无法帮助你。 它在代码中的其他东西导致性能瓶颈。

  ask by endian translate from so

未解决问题?本站智能推荐:

5回复

C#JIT编译和.NET

我对JIT编译器的工作方式的细节有些困惑。 我知道C#可以编译为IL。 第一次运行它是准时的。 这是否涉及将其转换为本地代码? .NET运行时(作为虚拟机吗?)是否与JIT代码交互? 我知道这很幼稚,但我真的很困惑。 我的印象一直是.NET运行时不解释程序集,但我不了解交互的详细信息
1回复

C#JIT优化器中可能存在的错误?

使用SQLHelper类来自动化存储过程调用的方式与XmlRpc.Net库中的方法类似,在运行从IL代码手动生成的方法时遇到了一个非常奇怪的问题。 我把它缩小到一个简单的生成方法(可能它可以简化得更多)。 我创建了一个新的程序集和类型,包含两个符合的方法 测试方法只是将十进制参数
2回复

c#JIT和静态构造函数

好吧,我对那两件事情有点问题 以下情况:我得到了一个抽象类“发射器”。 这个类有一个静态字典来跟踪从中派生的所有类型。 例如,我有类“LinearEmitter”这个类有一个静态构造函数。 此构造函数将typeof(LinearEmitter)添加到字典中。 问题是现在,当我想
1回复

C#JIT编译器是否优化空检查?

在线上有许多文章列出了在执行一段代码之前C#JIT所做的优化。 例如,有关MSDN的这篇文章讨论了: 常量折叠,常量和副本传播,公共子表达式消除,循环不变量的代码运动,死存储和死代码消除,寄存器分配,方法内联,循环展开(带有小主体的小循环)。 我的问题是:JIT编译器还会处理
4回复

JIT(C#)创建的堆在哪里

我总是有一个问题,堆位于哪里(RAM /硬盘/其他(?))? 如果我通过代码将2 GB的文件加载到内存中,它将流向何方? 另外,这个“堆栈”在实际的位置在哪里? 内存 ? 实际执行团队中的某人可以告知我们吗? 因为大多数人所说的是它的RAM。 但是我真的想真正地知道这两者
3回复

C#编译器和JIT都做了哪些优化?

我继续在我的编译器类的C#编译器上工作。 目前我已经完成了教科书中关于编译器优化的章节。 在大多数情况下,我的教科书在编写时没有考虑到及时编译,我对C#编译器执行的静态,预jit优化的种类与JIT过程中的执行情况感到好奇? 当我与人们谈论有关CLR的编译时,我通常会听到类似的事情,
1回复

C#即时(JIT)调试而不是此对话框

我的JIT调试已启用,如下所示: http : //msdn.microsoft.com/zh-cn/library/k8kf6y2a(v=vs.85).aspx 为什么我收到此错误。 如何防止出现此错误? 应用程序正常运行,但我不知道为什么会收到此错误以及如何解决或删除它。
7回复

CLR与JIT

JIT编译器和CLR有什么区别? 如果您将代码编译为il并且CLR运行该代码,那么JIT正在做什么? JIT编译如何通过向CLR添加泛型来改变?
1回复

C#编译器或JIT可以优化lambda表达式中的方法调用吗?

我在另一个StackOverflow问题开始( 在评论中 )的讨论后开始这个问题,我很想知道答案。 考虑以下表达式: 在这种情况下,将ListOfDates.Max()的评估移出Where子句会有任何(性能)​​优势,还是1.编译器或2. JIT优化它? 我相信C#只会在编译时进
2回复

基于C#的Windows服务 - 尝试在生产中进行JIT调试

我在我投入生产的服务的事件日志中收到此错误: RivWorks.FeedHandler.exe [5496]中发生了未处理的win32异常。 即时调试此异常失败,并出现以下错误:无法启动调试器,因为没有用户登录。 我在Win NT全局帐户下安装并运行它。 我不知道它为什么试