考虑以下两种情况:
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将内联getter。那么将多个对象与单个对象传递给一个函数会有更多的开销,还是这个也被优化了?
我专门寻找有关速度的答案。我正在编写一些代码来递归搜索一个非常大的树,所以这种类型的调用将被使用很多次。我的函数必须在超时发生之前尽快返回。我想尽可能地搜索树。
如果速度基本相同(即JIT使两个函数基本相同),那么我可以根据可读性和可维护性进行选择。
顺便说一下,在Java中是否有 magic 参数,如果你留在下面,那没关系,但如果你过去就不好了?例如,我曾在机器上工作,如果你有4个或更少的参数,那么它们将存储在寄存器中,超过4个将被压入堆栈? 顺便说一下,我还是Java新手...另外,在回答“早熟”之前,我理解过早优化。我现在处于优化阶段。我编写了我正在尝试优化的递归函数,TIA。
答案 0 :(得分:0)
您似乎处于设计阶段,而不是优化阶段。方法签名是您在优化时要检查的最后一件事。
方法签名完全取决于它需要处理的内容。如果这些数字是相关的,那么为它们创建一个包装器对象并为您的域中的该包装类找到一个有意义的名称是有意义的。主要优点是,当您需要向该对象添加一些额外字段(或删除一些字段)时,您不需要触摸方法签名。此外,您很可能会找到该包装器对象的其他用法,因为它在您的域中具有意义。
在术语或性能方面,创建持有者对象会产生开销,因此如果这些数字自然不属于同一个,那么为它们定义容器是个坏主意。但是如果你知道它们不属于一起,但你的方法需要它们,那么你将从设计阶段对它进行排序(只需在方法签名中单独列出它们)。
长话短说,如果你最终在“优化阶段”修改了方法签名,那就是你跳过设计阶段的强烈信号。