我想产生一些“Hello World”的大小C#代码段会招致JIT内联。 到目前为止,我有这样的:
class Program
{
static void Main(string[] args)
{
Console.WriteLine( GetAssembly().FullName );
Console.ReadLine();
}
static Assembly GetAssembly()
{
return System.Reflection.Assembly.GetCallingAssembly();
}
}
这是我作为编译“版本” - “任何CPU”,并从Visual Studio“没有调试运行”。 它显示我的示例程序组件的名称,以便明确地GetAssembly()
不是内联到Main()
否则会使显示mscorlib
组件名称。
如何撰写一些C#代码段,将招致JIT内联?
当然,这里有一个例子:
using System;
class Test
{
static void Main()
{
CallThrow();
}
static void CallThrow()
{
Throw();
}
static void Throw()
{
// Add a condition to try to disuade the JIT
// compiler from inlining *this* method. Could
// do this with attributes...
if (DateTime.Today.Year > 1000)
{
throw new Exception();
}
}
}
在一份新闻稿中样模式下进行编译:
csc /o+ /debug- Test.cs
跑:
c:\Users\Jon\Test>test
Unhandled Exception: System.Exception: Exception of type 'System.Exception' was
thrown.
at Test.Throw()
at Test.Main()
注意堆栈跟踪-这看起来好像Throw
被直接调用Main
,因为代码CallThrow
被内联。
你的内联的理解似乎不正确的:如果GetAssembly
被内联,它仍然会显示你的程序的名称。
内联表示:“使用函数体在函数调用的地方”。 内联GetAssembly
会导致相当于这样的代码:
class Program
{
static void Main(string[] args)
{
Console.WriteLine(System.Reflection.Assembly.GetCallingAssembly()
.FullName);
Console.ReadLine();
}
}