我根据您的代码创建了一个快速而肮脏的微型基准测试。结果是:
循环:3192
拉姆达:3140
拉姆达平行:868
因此,循环和lambda是等效的,并且并行流显着提高了性能。由于您的基准测试方法,我怀疑您的结果不可靠。
public static void main(String[] args) { int sum = 0; //warmup for (int i = 0; i < 100; i++) { solve(); solveLambda(); solveLambdaParallel(); } { long start = System.nanoTime(); for (int i = 0; i < 100; i++) { sum += solve(); } long end = System.nanoTime(); System.out.println("loop: " + (end - start) / 1_000_000); } { long start = System.nanoTime(); for (int i = 0; i < 100; i++) { sum += solveLambda(); } long end = System.nanoTime(); System.out.println("lambda: " + (end - start) / 1_000_000); } { long start = System.nanoTime(); for (int i = 0; i < 100; i++) { sum += solveLambdaParallel(); } long end = System.nanoTime(); System.out.println("lambda parallel : " + (end - start) / 1_000_000); } System.out.println(sum);}public static int digitSum(BigInteger x) { int sum = 0; for (char c : x.toString().toCharArray()) { sum += Integer.valueOf(c + ""); } return sum;}public static int solve() { int max = 0; for (int i = 1; i < 100; i++) { for (int j = 1; j < 100; j++) { max = Math.max(max, digitSum(BigInteger.valueOf(i).pow(j))); } } return max;}public static int solveLambda() { return IntStream.range(1, 100) .map(i -> IntStream.range(1, 100).map(j -> digitSum(BigInteger.valueOf(i).pow(j))).max().getAsInt()) .max().getAsInt();}public static int solveLambdaParallel() { return IntStream.range(1, 100) .parallel() .map(i -> IntStream.range(1, 100).map(j -> digitSum(BigInteger.valueOf(i).pow(j))).max().getAsInt()) .max().getAsInt();}我也用jmh运行它,它比手动测试更可靠。结果与上面的结果一致(每个呼叫微秒):
Benchmark Mode Mean Unitsc.a.p.SO21968918.solve avgt 32367.592 us/opc.a.p.SO21968918.solveLambda avgt 31423.123 us/opc.a.p.SO21968918.solveLambdaParallel avgt 8125.600 us/op



