我正在尝试制作一些会导致JIT内联的“Hello World”大小的C#代码段。到目前为止,我有这个:
class Program
{
static void Main(string[] args)
{
Console.WriteLine( GetAssembly().FullName );
Console.ReadLine();
}
static Assembly GetAssembly()
{
return System.Reflection.Assembly.GetCallingAssembly();
}
}
我从Visual Studio编译为“Release” - “Any CPU”和“Run without debugging”。它显示了我的示例程序集的名称,因此GetAssembly()
没有内联到Main()
,否则会显示mscorlib
程序集名称。
如何编写一些会导致JIT内联的C#代码片段?
答案 0 :(得分:6)
当然,这是一个例子:
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
的代码已内联。
答案 1 :(得分:1)
您对内联的理解似乎不正确:如果内联GetAssembly
,它仍会显示您的程序名称。
内联意味着:“在函数调用的位置使用函数体”。内联GetAssembly
会导致代码与此相当:
class Program
{
static void Main(string[] args)
{
Console.WriteLine(System.Reflection.Assembly.GetCallingAssembly()
.FullName);
Console.ReadLine();
}
}