Effective C# 原则31:选择小而简单的函数
2009-02-19 08:16:07 来源:WEB开发网在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编译器同样决定内联方法。内联就是说直接使用函数体而不必调用函数。考虑这个例子:
- ››选择好的广告联盟:选择广告联盟理解掌握的六大绝招...
- ››选择谁? 揭秘90后必备的音乐播放器
- ››选择性关闭Win 7视频预览 节约系统资源
- ››选择适合的SRAM存储器的技巧
- ››Effective C# 原则40:根据需求选择集合
- ››Effective C# 原则41:选择DataSet而不是自定义的...
- ››Effective C# 原则42:使用特性进行简单的反射
- ››Effective C# 原则43:请勿滥用反射
- ››Effective C# 原则44:创建应用程序特定的异常类
- ››Effective C# 第6章:杂项
- ››Effective C# 原则45:选择强异常来保护程序
- ››Effective C# 原则47:选择安全的代码
更多精彩
赞助商链接