Tag: jit

C# – 为什么class,new()约束使用Activator.CreateInstance ()?

我刚刚问过C# – new()约束的generics如何生成机器代码? 在思考了一段时间之后,我想知道为什么C#编译器会像这样发出IL。 为什么不能说一些IL喜欢:“调用T的默认构造函数”?

.NET中预先assembly程序集的优点和缺点是什么?

.NET中预先assembly程序集的优点和缺点是什么? 我听说预先咬合会提高性能。 什么时候应该预先jit,什么时候不应该预先jit?

ldstr在内部实现newobj吗?

众所周知,字符串是隐式实例化的,这意味着我们不必使用new来获取对象的对象的引用。 因此,我始终相信框架正在处理这个问题,因此如果我做了类似的事情,我会得到相同的IL: String first = new String(new char[] {‘a’}); string second = “a”; 然而,似乎第一行是使用newobj instance void [mscorlib]System.String::.ctor(char[])和第二行ldstr “a” 。 所以为了获得一个字符串引用, ldstr内部调用newobj ,在哪里可以看到规范/细节来支持它?

变量在C#Release x64中没有递增

有人可以向我解释为什么当我在x86平台上执行它以及为什么它在x64上失败时这段代码表现良好? 结果: x86调试:12345678910 x64调试:12345678910 x86发布:12345678910 x64发布:1111111111 如果我改变某些东西,比如删除一个未使用的变量,或者如果我在p_lFirstId ++之后删除无用的for循环,那么奇怪的行为就会消失。 我发现在我的发布配置中将“pdb-only”更改为“full”,它再次起作用。 如果你直接从visual studio运行代码,它也做得很好。 这是JIT Compiler的错误吗? 先感谢您。 class Program { static void Main(string[] args) { Test(null, null, null, 0, 1); } public static void Test( List liste, List unused1, string unused2, int unused3, long p_lFirstId) { liste = new List(); StringBuilder sbSql = new StringBuilder(); for (int i […]

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

我在另一个StackOverflow问题开始( 在评论中 )的讨论后开始这个问题,我很想知道答案。 考虑以下表达式: var objects = RequestObjects.Where(r => r.RequestDate > ListOfDates.Max()); 在这种情况下,将ListOfDates.Max()的评估移出Where子句会有任何(性能)​​优势,还是1.编译器或2. JIT优化它? 我相信C#只会在编译时进行常量折叠,并且可以认为ListOfDates.Max()在编译时是不可知的,除非ListOfDates本身在某种程度上是常量。 也许还有另一个编译器(或JIT)优化,确保只评估一次?

为什么我的方法调用Assembly.GetCallingAssembly()不是JIT内联?

我正在尝试制作一个简短的C#代码段,它将说明由于MSDN中概述的JIT内联而更改Assembly.GetCallingAssembly()行为。 到目前为止,这是我的代码: class Program { static void Main(string[] args) { Console.WriteLine( GetAssembly().FullName ); Console.ReadLine(); } static Assembly GetAssembly() { return System.Reflection.Assembly.GetCallingAssembly(); } } 我在“Release”中构建并开始使用“Start Without Debugging” – 这个设置使得这个答案的代码产生内联。 我看到的结果是 ConsoleApplication2, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null 很明显GetAssembly()没有内联到Main() ,否则我会看到mscorlib作为调用程序集。 我已经查看了所有内联标准,但我不明白为什么不会内联GetAssembly() 。 是否有可能知道为什么JIT编译器决定不内联调用?

GetCallingAssembly()和GetExecutingAssembly()是否同样倾向于JIT内联?

有Assembly.GetExecutingAssembly()和Assembly.GetCallingAssembly() 。 请注意, GetCallingAssembly()有一个Remark提到根据JIT内联的行为方式,一个方法可能(或没有)内联到另一个方法中,因此GetCallingAssembly()返回不同的结果。 现在GetExecutingAssembly()有何不同? JIT内联可以在技术上内联调用GetExecutingAssembly()的代码,因此代码现在属于不同的程序集,并且取决于是否发生GetExecutingAssembly()也可以产生不同的结果。 为什么GetExecutingAssembly()描述没有提到类似于GetCallingAssembly()描述的JIT inining?

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

我在我投入生产的服务的事件日志中收到此错误: RivWorks.FeedHandler.exe [5496]中发生了未处理的win32exception。 即时调试此exception失败,并出现以下错误:无法启动调试器,因为没有用户登录。 我在Win NT全局帐户下安装并运行它。 我不知道它为什么试图进入调试模式。 它是在Release模型下构建的。 在4.0 Framework上运行。 当我在我的开发机器上运行时,通过EXE入口点而不是WinSvc入口点,一切运行正常 – 但是 – 我已经处于“调试”模式。 有什么想法的想法? 2010-10-21 – 注意 – 更改了代码库。 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Diagnostics; using System.Linq; using System.ServiceProcess; using System.Text; using System.IO; using sysIO = System.IO; using RivWorks.FeedHandler; using System.Collections; namespace RivWorks.FeedHandler.Service { public partial class FeedListener : […]

了解C#中运行时代码生成的各种选项(Roslyn,CodeDom,Linq Expressions,…?)

我正在开发一个应用程序,我想动态生成用于数值计算的代码(用于性能)。 将此计算作为数据驱动操作太慢。 要描述我的要求,请考虑以下类: class Simulation { Dictionary nodes; double t, dt; private void ProcessOneSample() { t += dt; // Expensive operation that computes the state of nodes at the current t. } public void Process(int N, IDictionary Input, IDictionary Output) { for (int i = 0; i < N; ++i) { foreach (KeyValuePair j in […]

如何理解在C#中使用exception处理“使用”的JITed代码

我在C#中编写了一个非常简单的类: class DisposableClass : IDisposable { public void Dispose() { } } static void UsingClass() { // line 31 using (var dc = new DisposableClass()) { // line 32 DoSomething(dc); // line 33 } // line 34 } // line 35 我使用WinDBG将JIT之后的本机代码转储到它: 0:000> !u 000007fe87d30120 Normal JIT generated code SimpleConsole.Program.UsingClass() Begin 000007fe87d30120, size 80 c:\projects\SimpleConsole\SimpleConsole\Program.cs […]