C# 4.0 一般规划问题

C# 4.0 一般规划问题,c#-4.0,if-statement,parameter-passing,C# 4.0,If Statement,Parameter Passing,思考三个问题A、B和C A使用x,y方法求解 B使用x、z和 C使用x,y,z 哪个更好,哪个性能更好,哪个可读性更好: “写三种不同的方法” “写一种方法,取一种方法 或两个参数,并决定 部件将在if语句中运行“ 请解释原因。您需要在性能和模块化之间进行权衡 性能-当您使用三种方法时,在堆栈上保存当前函数、分配新函数框架和调用等方面可能会有更高的开销。但是,随着我们的机器和内存越来越大,您选择在.NETFramework上编写代码这一事实本身就说明了一些问题。这类琐碎决策的性能并不是什么大问题

思考三个问题A、B和C

A使用x,y方法求解

B使用x、z和

C使用x,y,z

哪个更好,哪个性能更好,哪个可读性更好:

  • “写三种不同的方法”

  • “写一种方法,取一种方法 或两个参数,并决定 部件将在if语句中运行“


  • 请解释原因。

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

    性能-当您使用三种方法时,在堆栈上保存当前函数、分配新函数框架和调用等方面可能会有更高的开销。但是,随着我们的机器和内存越来越大,您选择在.NETFramework上编写代码这一事实本身就说明了一些问题。这类琐碎决策的性能并不是什么大问题,所以我更喜欢将其模块化

    模块化-从长远来看,方法只做一件事,其他程序员可以轻松理解,而不必真正理解您的想法,是一种更好的代码。想象一下错误、修复、测试的成本,以及不同开发人员在未来不同时间反复理解代码所需的时间。如果您有一个非常模块化的方法/函数,它可以单独测试,那么与复杂函数相比,它具有更高的可重用性,因为如果其他开发人员理解您的API/代码或两者都理解,他们会感到自信

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


    我将分解您正在使用x、y、z实现的特性,并生成尽可能多的方法。这遵循一条简单的规则:每个方法只做一项工作,不多不少。然后,您可以组合这些方法来实现A、B、C所需的任何功能。

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

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

    考虑到随着代码库的发展,我可能希望执行一些重构,这需要我识别
    z
    的用法。在“三种方法”的情况下,这很简单,因为我只需查找所有的
    z
    调用站点——这是大多数现代IDE和交叉引用工具可以为我做的。在“一种方法”的情况下,分析更加复杂。我不仅需要识别所有呼叫站点,还需要进行流量分析,以确定触发不同行为的参数值。如果这些参数是常量,这可能不会太麻烦。但是如果他们是经过计算的,那么可能会有很多工作,特别是如果他们是在呼叫链的某个位置进行计算的话


    < P >如果应用程序分析显示三种方法都是一个显著的性能瓶颈,那么我认为将三种方法合并为一种优化。

    < P>在单独的方法中,每种方法都是更好的。 如果您使用某种条件结构,那么您的程序肯定必须在运行时通过该结构

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


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

    恐怕这个问题太抽象了,对我来说没有任何意义。你在写3种方法(A、B和C),每种方法都需要不同的辅助方法(X、Y和Z)来完成它们的工作吗?好吧,我想问一个抽象的问题来阅读解释,但我的全部目的是学习这些“写三种不同方法”的答案,或者“编写一个方法并获取一个或两个参数并决定哪个部分将在if语句中运行”?因此我这样问,感谢您在回答问题上的帮助。这不一定是真的。一个优化编译器(或者在本例中是JITter)如果内联函数提供了真正的性能优势,那么它可以调用内联函数。此外,较长的函数会增加代码大小,在某些情况下可能会降低性能。如果代码不再完全适合处理器的缓存,那么将有更多的缓存未命中,这将超过方法调用的开销。我基本上同意您的观点这里是alysis;这是一个很好的书面回答。我很欣赏你将问题分解为两个相反的问题,然后对这两个问题进行比较的方式。当然,你已经找到了至少一个理由将绩效视为一个问题,还有Marcin的回答(结合我对sherif回答的评论)至少还提供了两个。分离方法确实是正确的方法。很难想象有什么令人信服的理由不这样做。