Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/388.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java中变量参数方法的性能_Java_Performance - Fatal编程技术网

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) {

我有一个关于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) {
            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