0

考虑以下两种情况:

void Foo1(int a, int b, int c, int d) {
    return a + b + c + d;
}

相对

void Foo2(MyArgs args) {
    return args.getA() + args.getB() + args.getC() + args.getD();
}

两种情况都有速度优势吗?我读过 JIT 将内联吸气剂。那么将多个对象与将单个对象传递给函数相比是否有更多开销,或者这是否也被优化了?

我专门寻找有关速度的答案。我正在编写一些代码来递归搜索一棵非常大的树,所以这种类型的调用将被使用很多很多次。我的函数必须在超时发生之前尽快返回。我想尽可能地搜索到树中。

如果速度基本相同(即 JIT 使两个功能基本相同),那么我可以根据可读性和可维护性进行选择。

顺便说一句,Java中是否有很多参数,如果你保持在下面,那没关系,但如果你越过它就不好了?例如,我在机器上工作过,如果您有 4 个或更少的参数,那么它们将存储在寄存器中,而超过 4 个将被推入堆栈?

顺便说一句,我仍然是Java新手......

另外,在您回答“过早”之前,我了解过早优化。我现在处于优化阶段。我已经编写了我想要优化的递归函数,TIA。

4

1 回答 1

0

您似乎处于设计阶段,而不是优化阶段。方法签名是您在优化时要检查的最后一件事。

方法签名完全取决于它需要处理的内容。如果这些数字是相关的,那么为它们创建一个包装器对象并在您的域中为该包装器类找到一个有意义的名称是有意义的。主要优点是当您需要向该对象添加一些额外的字段(或删除一些)时,您不需要触摸您的方法签名。此外,您很可能会发现该包装对象的其他用法,因为它在您的领域中具有意义。

就性能而言,创建持有者对象会产生开销,因此如果这些数字自然不属于一起,那么为它们定义容器是个坏主意。但是,如果您知道它们不属于一起,但您的方法需要它们全部,那么您将从设计阶段解决这个问题(只需在方法签名中单独列出它们)。

长话短说,如果你最终在“优化阶段”修改了方法签名,那是一个强烈的信号,表明你已经跳过了设计阶段。

于 2013-10-09T22:01:39.917 回答