多参数Java方法-性能

多参数Java方法-性能,java,performance,methods,parameters,Java,Performance,Methods,Parameters,当我使用have/use方法和很多(超过100个)参数时,它在计算性能方面是否不够有效 我的意思不是说在可维护性方面有效率,而只是在“原始”计算性能方面:)好吧,这是有成本的。所有这些参数都必须推送到堆栈上。我不认为它会给计算能力带来麻烦,除非它是在一个重循环中 你是在生一个程序员同事的气吗?或者制作某种编程创建的代码?正如下面的文章所说,使用较少的参数,它的性能会更好,但性能并没有太大的影响。但是你应该考虑传递一个对象。 回答您的问题:不,传递100个参数不会对性能造成重大影响。与另一个答案不

当我使用have/use方法和很多(超过100个)参数时,它在计算性能方面是否不够有效


我的意思不是说在可维护性方面有效率,而只是在“原始”计算性能方面:)

好吧,这是有成本的。所有这些参数都必须推送到堆栈上。我不认为它会给计算能力带来麻烦,除非它是在一个重循环中


你是在生一个程序员同事的气吗?或者制作某种编程创建的代码?

正如下面的文章所说,使用较少的参数,它的性能会更好,但性能并没有太大的影响。但是你应该考虑传递一个对象。


回答您的问题:不,传递100个参数不会对性能造成重大影响。与另一个答案不同,我建议不要传递对象。如果这样做,代码将无法维护。我看到的地图上充满了没有人能理解的参数。相反,使用Joshua Block在有效Java中推荐的最佳实践(第7章,方法签名)将参数数量保持在合理水平

例如:将方法分解为多个方法

请参见对类似问题的回答:


我目前正在读一本名为《Java:好的部分》的书。它建议,一般来说,传递接口是一种方法。我建议您使用100个参数创建一个接口,并传递它,而不是传递100个参数。未来的情况会更清楚


就我而言,最大的成本将是维护它。但是,如果您只打算这样做的话,那么一次传递这些参数并没有太大区别。

理论上,可能是因为Java是按值传递的,这意味着当调用函数时,JVM会复制每个参数值并将副本提供给函数,因此,在某些情况下,参数的数量对执行时间的影响是不可忽略的。但在实践中,只要有可能,这些拷贝都是“浅”拷贝,这意味着它们更像是参考资料,所以实际制作拷贝的时间非常少。因此,您可能需要超过100个参数才能对性能时间产生显著影响

在任何情况下,即使考虑像这样的东西的性能时间听起来也很像过早的优化。它几乎肯定不是你的程序的瓶颈,所以在你确定它确实导致了减速之前,花时间在它上是不值得的。如果您的程序速度慢得令人无法接受,请调查其他可能的减速来源

当然,正如您所提到的,还有“可维护性”问题。为什么一个函数需要数百个参数?它们是复杂的参数,例如自定义对象的ArrayList,还是简单的内置数据类型?如果是后者,为什么不考虑将它们打包成数组、数组列表等等?或者,为什么不将函数分解为多个函数?现代计算机的速度足够快,对于许多(可以说是大多数)目的来说,程序员的时间比处理器的时间更有价值,所以在编码时,你首先关心的应该是你写的东西是否可以理解和写得好,而不是它是否快


(如果你真的需要它非常非常快,你可能应该使用C或FORTRAN。)

这很难回答,大多数人发现不止几个方法参数表明了一个严重的问题

尽管有一些方面,当您考虑它时,也表明许多方法参数将对性能产生影响。每个方法参数占用堆栈上的一个插槽(就像局部变量一样)。插槽本身基本上是免费的,但在调用方法monster时,还必须填充每个参数插槽。这意味着调用者不可避免地要执行一些读取操作来获取插槽的值,并且还要将该值推送到堆栈

是的,每个参数都有一个很小的代价,作为第一近似值,代价与参数的数量成线性关系

现在,当您从某个地方提取参数值时,您实际上做了更多的工作,而不仅仅是传递对所述参数的引用。例如,假设您有一种方法来计算矩形的面积,并使用4个参数写入:

public int area(int x1, int y1, int x2, int y2) {
     return ....;
}
而不是

public class Rectangle {
    int x1, y1, x2, y2;

    public int area() {
        return ....;
    }
}
现在在第一种情况下,您需要拉取4个int并将它们推回堆栈,而要调用第二种情况,您只需要拉取对矩形的引用。尽管矩形的area()方法仍然需要拉取其成员,但您至少保存了3次堆栈推送(使用100个参数,您可能可以保存更多)

另外,一个有100个参数的方法意味着它是一个相当大的方法,否则大多数参数无论如何都不会被使用,只会是一种浪费。大型方法意味着很高的复杂性,这可能会干扰JIT生成好代码的能力。这很难演示,但一个简单的例子是方法内联。JIT对于内联会考虑多少代码有限制,大方法不是候选。
在某种程度上,您可以期望JIT能够最好地处理常用的习惯用法(显然,优化最常见的情况会带来更大的成效),100个方法参数显然超出了常用的范围。

这听起来很疯狂。。100方法参数???我差点心脏病发作。你怎么处理100个参数的方法??您应该有最大值3。@Ioan 3有点太苛刻了,但我同意,100远远超出了大多数限制。许多参数要求将它们包装在散列或类实例中。100是不可想象的。如果单独调用该方法,则不会对性能造成影响,但请想象如果使用该方法,堆栈会发生什么情况