一般编程问题

时间:2011-03-15 07:47:08

标签: c#-4.0 if-statement parameter-passing

考虑A,B和C三个问题。

A使用x,y方法来解决;

B使用x,z和

C使用x,y,z。

哪一个会更好,哪一个可以提供更好的性能,哪一个可以更具可读性:

  1. “写三种不同的方法”

  2. “写一种方法并拿一种方法 或两个参数并决定哪个 part将在if语句“

  3. 中运行

    请解释原因。

4 个答案:

答案 0 :(得分:4)

您需要在性能和模块性之间进行权衡。

性能 - 当您制作三种方法时,可能会有更高的开销,即在堆栈上保存当前功能并分配新的功能框架并拨打电话等。但每天我们的机器和放大器;记忆变得越来越快,而你选择在.NET框架上编写代码本身就说明了一些事情。这种微不足道的决定的表现并不是什么大不了的事情,所以我更愿意让它变得模块化。

模块化 - 一种方法完全可以做到一件事,其他程序员可以很容易地理解,而不必理解你的想法,从长远来看,这是一个更好的代码。想象一下错误,修复,测试的成本,以及不同开发人员在将来不同时间点反复理解代码所需的时间。如果您有一个非常模块化的方法/功能,与复杂功能相比,可以单独测试,也可以更高的可重用性,因为其他开发人员对他们理解您的API /代码或两者都有信心。

这是一种个人观点,我倾向于在长期内降低维护成本,提高可重用性,测试性能而不是性能。

我会拆分你用x,y,z实现的功能,并制作尽可能多的方法。这遵循简单的简单规则:每个方法都可以完成一项工作。然后,您可以组合这些方法来实现A,B,C所需的任何功能。

答案 1 :(得分:2)

最快的是为A,B,C写一个函数,但它可能会吃更多的ram。 每个方法调用都意味着机器代码的跳转,因此花费处理器时间。 差异太小,不值得更高的维护。这就是为什么你做更多的功能。

答案 2 :(得分:2)

在各方面编写单独的方法会更好。

如果您使用某种条件结构,您的程序肯定必须在运行时通过该结构。

相比之下,使用这些方法,一个充分优化的编译器(我不熟悉F#编译器,以及它是否这样做)可以扩展方法文本,节省创建新的堆栈帧。即使你的编译器没有那么优化,创建一个新的堆栈框架也相对便宜。

编辑:正如Cody Gray所说,较大的程序文本可能会降低性能,因为它可能会增加处理器缓存未命中率。

答案 3 :(得分:1)

我赞成采用“三种方法”的方法。为了管理复杂性,人们应该利用任何机会消除条件中的条件和分支。

考虑到随着代码库的发展,我可能希望执行一些重构,这需要我确定z的用法。在“三方法”的情况下,这是微不足道的,因为我只是寻找所有z调用站点 - 大多数现代IDE和交叉引用工具将为我做的事情。在“一种方法”的情况下,分析更复杂。我不仅需要识别所有呼叫站点,而且还需要进行流量分析以确定触发不同行为的参数值。如果这些参数是常数,这可能不会太繁琐。但如果计算它们,那么它可能会做很多工作,特别是如果它们是在调用链的某个地方计算的。

如果且仅当应用程序分析显示这三种方法是一个重要的性能瓶颈时,我会考虑将这三种方法合并为一种优化。