做为一个有经验的程序员,不管你在使用C#以前是习惯用什么语言的,我们 综合了几个可以让你开发出有效代码的实际方法。有些时候,我们在先前的环境 中所做的努力在.Net环境中却成了相反的。特别是在你试图手动去优化一些代码 时尤其突出。你的这些行为往往会阻止JIT编译器进行最有效的优化。你的以性 能为由的额外工作,实际上产生了更慢的代码。你最好还是以你最清楚的方法写 代码,其它的让JIT编译器来做。最常见的一个例子就是预先优化,你创建一个 很长很复杂的函数,本想用它来避免太多的函数调用,结果会导致很多问题。实 际操作时,提升这样一个函数的逻辑到循环体中对.Net程序是有害的。这与你的 真实是相反的,让我们来看一些细节。
这一节介绍一个简单的内容,那 就是JIT编译器是如何工作的 。.Net运行时调用JIT编译器,用来把由C#编译器 生成的IL指令编译成机器代码。这一任务在应用程序的运行期间是分步进行的。 JIT并不是在程序一开始就编译整个应用程序,取而代之的是,CLR是一个函数接 一个函数的调用JIT编译器。这可以让启动开销最小化到合理的级别,然而不合 理的是应用程序保留了大量的代码要在后期进行编译。那些从来不被调用的函数 JIT是不会编译它的。你可以通过让JIT把代码分解成更多的小块,从而来最小化 大量无关的代码,也就是说小而多的函数比大而少的函数要好。考虑这个人为的 例子:
public string BuildMsg( bool takeFirstPath )
{
StringBuilder msg = new StringBuilder( );
if ( takeFirstPath )
{
msg.Append( "A problem occurred." );
msg.Append( "\nThis is a problem." );
msg.Append( "imagine much more text" );
} else
{
msg.Append( "This path is not so bad." );
msg.Append( "\nIt is only a minor inconvenience." );
msg.Append( "Add more detailed diagnostics here." );
}
return msg.ToString( );
}
在BuildMsg第一次调用时,两个选择 项就都编译了。而实际上只有一个是须要的。但是假设你这样写代码:
public string BuildMsg( bool takeFirstPath )
{
if ( takeFirstPath )
{
return FirstPath( );
} else
{
return SecondPath( );
}
}