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

做为一个有经验的程序员,不管你在使用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( );
 }
}

时间: 2024-11-02 13:37:07

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

Effective C#原则42:使用特性进行简单的反射

当你创建了一个与反射相关的系统时,你应该为你自己的类型,方法,以及 属性定义一些自己的特性,这样可以让它们更容易的被访问.自定义的特性标示 了你想让这些方法在运行时如何被使用.特性可以测试一些目标对象上的属性. 测试这些属性可以最小化因为反射时可能而产生的类型错误. 假设你须 要创建一个机制,用于在运行时的软件上添加一个菜单条目到一个命令句柄上.这个须要很简单:放一个程序集到目录里,然后程序可以自己发现关于它的一些 新菜单条目以及新的菜单命令.这是利用反射可以完成的最好的工作之一:你的 主程序须

如何写出小而清晰的函数?(JS 版)

本文以 JavaScript 为例,介绍了该如何优化函数,使函数清晰易读,且更加高效稳定. 软件的复杂度一直在持续增长.代码质量对于保证应用的可靠性.易扩展性非常重要. 然而,几乎每一个开发者,包括我自己,在职业生涯中都见过低质量的代码.这东西就是个坑.低质量代码具备以下极具杀伤力的特点: 函数超级长,而且塞满了各种乱七八糟的功能. 函数通常有一些副作用,不仅难以理解,甚至根本没法调试. 含糊的函数.变量命名. 脆弱的代码:一个小的变更,就有可能出乎意料的破坏其他应用组件. 代码覆盖率缺失. 它

python简单的函数定义和用法实例

  这篇文章主要介绍了python简单的函数定义和用法,实例分析了Python自定义函数及其使用方法,具有一定参考借鉴价值,需要的朋友可以参考下 这里定义了一个温度转换的函数及其用法. ? 1 2 3 4 5 6 7 8 9 def convertTemp(temp, scale): if scale == "c": return (temp - 32.0) * (5.0/9.0) elif scale == "f": return temp * 9.0/5.0 +

mbstowcs-高手指教,为什么这个简单的函数会报错呢??

问题描述 高手指教,为什么这个简单的函数会报错呢?? #include #include #include using namespace std; wstring w2chs3(const char s1) { size_t len = strlen(s1); // wchar_t *ws2 = new wchar_t[len]; wchar_t *ws2 = (wchar_t)malloc(len*sizeof(wchar_t)); unique_ptr wstr(ws2); mbstowc

PowerShell小技巧之从函数中返回多个值_PowerShell

假设一个PS脚本函数需要返回多个值,最好的办法是返回对象并且存储对象独有的属性. 这里有一个不错的方法.它能轻松的返回你想要的多个信息,并将结果分配给多个变量: function Get-MultipleData { Get-Date 'Hello' 1+4 } $date,$text,$result=Get-MultipleData "The date is $date" "The text was $text" "The result is $resu

Effective C#原则32:选择小而内聚的程序集

这一原则实际应该取这个名字:"应该创建大小合理而且包含少量公共 类型的程序集".但这太沉长了,所以就以我认为最常见的错误来命名: 开发人员总是把所有的东西,除了厨房里水沟以外(译注:夸张说法,kitchen sink可能是个口语词,没能查到是什么意思,所以就直译了.),都放到一个程 序集.这不利于重用其中的组件,也不利于系统中小部份的更新.很多以二进制 组件形式存在的小程序集可以让这些都变得简单. 然而这个标题对于程 序集的内聚来说也很醒目的.程序集的内聚性是指概念单元到单个组件的职责

Effective C#原则45:选择强异常来保护程序

当你抛出异常时,你就在应用程序中引入了一个中断事件.而且危机到程序 的控制流程.使得期望的行为不能发生.更糟糕的是,你还要把清理工作留给最 终写代码捕获了异常的程序员.而当一个异常发生时,如果你可以从你所管理的 程序状态中直接捕获,那么你还可以采取一些有效的方法.谢天谢地,C#社区不 须要创建自己的异常安全策略,C++社区里的人已经为我们完成了所有的艰巨的 工作.以Tom Cargill的文章开头:"异常处理:一种错误的安全感觉, " 而且Herb Sutter,Scott Meyer

Effective C#原则47:选择安全的代码

.Net运行时已经设计好了,一些怀有恶意的代码不能渗透到远程计算机上并 执行.目前一些分部式系统依懒于从远程机器上下载和执行代码.如果你可以通 过Internet或者以太网来发布你的软件,或者直接从web上运行,但你须要明白 CRL在你的程序集中的一些限制.如果CLR不是完全相信一个程序集,它会限制一 些的行为.这些调用代码要有访问安全认证(CAS).从另一方面来说,CLR强制要 求基于角色的安全认证,这样这些代码才能或者不能在基于一个特殊的角色帐号 下运行. 安全违例是运行时条件,编译器不能强

Effective C#原则40:根据需求选择集合

"哪种集合是最好的?"答案是:"视情况而定." 不同的集合有不同的性能,而且在不同的行为上有不同的优化..Net框架支持很 多类似的集合:链表,数组,队列,栈,以及其它的一些集合.C#支持多维的数 组,它的性能与一维的数组和锯齿数组都有所不同..Net框架同样包含了很多特 殊的集合,在你创建你自己的集合类之前,请仔细参阅这些集合.你可以发现很 多集合很快,因为所有的集合都实现了ICollection接口.在说明文档中列出了 所有实现了ICollection接口的集合