WEB开发网
开发学院软件开发C语言 Effective C# 原则31:选择小而简单的函数 阅读

Effective C# 原则31:选择小而简单的函数

 2009-02-19 08:16:07 来源:WEB开发网   
核心提示: 在BuildMsg第一次调用时,两个选择项就都编译了,Effective C# 原则31:选择小而简单的函数(2),而实际上只有一个是须要的,但是假设你这样写代码:public string BuildMsg( bool takeFirstPath ){if ( takeFirstPath

在BuildMsg第一次调用时,两个选择项就都编译了。而实际上只有一个是须要的。但是假设你这样写代码:

public string BuildMsg( bool takeFirstPath )
{
 if ( takeFirstPath )
 {
  return FirstPath( );
 } else
 {
  return SecondPath( );
 }
}

因为函数体的每个分支被分解到了独立的小函数中,而JIT就是须要这些小函数,这比前面的BuildMsg调用要好。确实,这个例子只是人为的,而且实际上它也没什么太特别的。但想想,你是不是经常写更“昂贵”的例子呢:一个if 语句中是不是每个片段中都包含了20或者更多的语句呢?你的开销就是让JIT在第一次调用它的时候两个分支都要编译。如果一个分支不像是错误条件,那到你就招致了本可以简单避免的浪费。小函数就意味着JIT编译器只编译它要的逻辑,而不是那些沉长的而且又不会立即使用的代码。对于很长的switch分支,JIT要花销成倍的存储,因此把每个分支的内容定义成内联的要比分离成单个函数要好。

JIT编译器可以更简单的对小而简单的函数进行可登记(enregistration)处理。可登记处理是指进程选择哪些局部变量可以被存储到寄存器中,而这比存储到堆栈中要好。创建少的局部变量可以能JIT提供更好的机会把最合适的候选对象放到寄存器中。这个简单的控制流程同样会影响JIT编译能否如期的进行变量注册。如果函数只有一个循环,那么循环变量就很可能被注册。然而,当你在一个函数中使用过多的循环时,对于变量注册,JIT编译器就不得不做出一些困难的决择。简单就是好,小而简单的函数很可能只包含简单几个变量,这样可以让JIT很容易优化寄存器的使用。

JIT编译器同样决定内联方法。内联就是说直接使用函数体而不必调用函数。考虑这个例子:

Tags:Effective 原则 选择

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接