Java中变量参数方法的性能
我有一个关于Java中参数数量可变的方法性能的问题 假设我有以下两种选择:Java中变量参数方法的性能,java,performance,Java,Performance,我有一个关于Java中参数数量可变的方法性能的问题 假设我有以下两种选择: public static final boolean isIn(int i, int v1, int v2) { return (v1 == i) || (v2 == i); } public static final boolean isIn(int i, int... values) { for (int v : values) { if (i == v) {
public static final boolean isIn(int i, int v1, int v2) {
return (v1 == i) || (v2 == i);
}
public static final boolean isIn(int i, int... values) {
for (int v : values) {
if (i == v) {
return true;
}
}
return false;
}
现在主要的问题来了,当我有第一个方法的版本时,它的参数会增加到20、30甚至50个。现在这只会伤害眼睛。好的,这是遗留代码,我想用一个变量arguments方法替换所有代码
你知道这会对绩效产生什么影响吗?编译器是否有可能对第二种方法进行一些优化,使其或多或少类似于第一种形式
编辑:好的,也许我不够清楚。我没有50个参数的方法的性能问题。正如Peter Lawrey所说,这只是关于可读性。
我想知道,如果我切换到具有可变参数数的新方法,是否会出现性能问题换句话说:如果您关心性能,那么最好的方法是什么?有50个参数的方法还是只有一个有变量参数的方法?这与您声明
isIn(int i, int[] values) {
然而,当调用方法时,在打包变量时会有一些小的开销。当分析器输出表明这是一个问题时,返回。在此之前,这是过早的优化。编译器几乎不进行优化。JVM可以优化代码,但这两种方法的性能并不相同。如果您有像
isIn(i、1、2、3、4、5、6、7、8、9/*加上40多行*/)这样的代码行
您需要担心的不仅仅是IMHO的性能问题。我首先会担心可读性
如果您担心性能问题,请将参数作为int[]
传递,以便重用
顺便说一句,查找大量int值的最有效方法是使用类似TIntHashSet的集合。听说过两个优化规则:
- 不要优化
- (仅限专家!)暂时不要优化
换言之,从性能的角度来看,这一点你不应该在意。我也有同样的问题,于是转向了实验
public class ArgTest {
int summation(int a, int b, int c, int d, int e, int f) {
return a + b + c + d + e + f;
}
int summationVArgs(int... args) {
int sum = 0;
for (int arg : args) {
sum += arg;
}
return sum;
}
final static public int META_ITERATIONS = 200;
final static public int ITERATIONS = 1000000;
static public void main(String[] args) {
final ArgTest at = new ArgTest();
for (int loop = 0; loop < META_ITERATIONS; loop++) {
int sum = 0;
final long fixedStart = System.currentTimeMillis();
for (int i = 0; i < ITERATIONS; i++) {
sum += at.summation(2312, 45569, -9816, 19122, 4991, 901776);
}
final long fixedEnd = System.currentTimeMillis();
final long vargStart = fixedEnd;
for (int i = 0; i < ITERATIONS; i++) {
sum += at.summationVArgs(2312, 45569, -9816, 19122, 4991, 901776);
}
final long vargEnd = System.currentTimeMillis();
System.out.printf("%03d:%d Fixed-Args: %d ms\n", loop+1, ITERATIONS, fixedEnd - fixedStart);
System.out.printf("%03d:%d Vargs-Args: %d ms\n", loop+1, ITERATIONS, vargEnd - vargStart);
}
System.exit(0);
}
}
即使在最好的时候,Vargs Args也从未下降到0毫秒 致@Canonical Chris
我不认为你们测试中的问题来自可变参数。函数sumationVArgs需要更多的时间来完成,因为for loop
我创建了这个函数并添加到基准测试中
int summationVArgs2(int... args) {
return args[0] + args[1] + args[2] + args[3] + args[4] + args[5];
}
这就是我所看到的:
028:1000000 Fixed-Args: 0 ms
028:1000000 Vargs-Args: 12 ms
028:1000000 Vargs2-Args2: 0 ms
函数“summationVArgs”中的for循环
被编译为比add函数更多的操作。它包含用于增加迭代器的添加操作
、用于检查条件的检查操作
、用于循环和退出循环的分支操作
,除用于退出循环的分支操作外,所有操作对每个循环都执行一次
对不起,我的英语不好。我希望你能理解我的英语:)好吧,具有大量参数的方法的问题不在于性能,也许你误解了我的问题。问题是我觉得有50种方法做同样的事情是很愚蠢的,我同意有50种方法是愚蠢的。这就是瓦拉格斯擅长取代的。@Deelazee:我完全理解你。在没有任何证据表明存在问题的情况下,您担心vararg方法的性能。问这个问题而不仅仅是使用varargs是过早的优化,也就是说,这是一个巨大的时间浪费。
028:1000000 Fixed-Args: 0 ms
028:1000000 Vargs-Args: 12 ms
028:1000000 Vargs2-Args2: 0 ms