1.测试代码
import java.util.stream.IntStream;
/**
* <p> @Title Test
* <p> @Description 测试类
*
* @author ACGkaka
* @date 2020/4/18 7:13
*/
public class Test {
/**
* 测试for()循环
*/
private static void forTest() throws InterruptedException {
for (int i = 0; i < 1_000; i++) {
Thread.sleep(1);
}
}
/**
* 测试IntStream.forEach()
*/
private static void streamTest() {
IntStream.rangeClosed(0, 1_000).forEach(i -> {
try {
Thread.sleep(1);
} catch (InterruptedException e) {
e.printStackTrace();
}
});
}
/**
* 测试IntStream.parallel().forEach()
*/
private static void parallelStreamTest() {
IntStream.rangeClosed(0, 1_000).parallel().forEach(i -> {
try {
Thread.sleep(1);
} catch (InterruptedException e) {
e.printStackTrace();
}
});
}
public static void main(String[] args) throws InterruptedException {
long t1 = 0;
long t2 = 0;
long t3 = 0;
for (int i = 0; i < 5; i++) {
long start = System.nanoTime();
forTest();
long period = System.nanoTime() - start;
System.out.println("forTest() \t\t\t\tspends \t" + period + "\tns");
t1 += period;
start = System.nanoTime();
streamTest();
period = System.nanoTime() - start;
System.out.println("streamTest() \t\t\tspends \t" + period + "\tns");
t2 += period;
start = System.nanoTime();
parallelStreamTest();
period = System.nanoTime() - start;
System.out.println("parallelStreamTest() \tspends \t" + period + "\tns");
t3 += period;
}
System.out.println("forTest() \t\t\t\t总耗时: " + t1 + "\tns; 平均耗时: " + (t1 / 5));
System.out.println("streamTest() \t\t\t总耗时: " + t2 + "\tns; 平均耗时: " + (t2 / 5));
System.out.println("parallelStreamTest() \t总耗时: " + t2 + "\tns; 平均耗时: " + (t3 / 5));
}
}
2.输出结果
forTest() spends 1839452800 ns
streamTest() spends 1728509300 ns
parallelStreamTest() spends 223115100 ns
forTest() spends 1725872700 ns
streamTest() spends 1713570500 ns
parallelStreamTest() spends 207338200 ns
forTest() spends 1689249000 ns
streamTest() spends 1714935500 ns
parallelStreamTest() spends 214474700 ns
forTest() spends 1678805400 ns
streamTest() spends 1679608600 ns
parallelStreamTest() spends 214144400 ns
forTest() spends 1691222600 ns
streamTest() spends 1701802500 ns
parallelStreamTest() spends 211717200 ns
forTest() 总耗时: 8624602500 ns; 平均耗时: 1724920500
streamTest() 总耗时: 8538426400 ns; 平均耗时: 1707685280
parallelStreamTest() 总耗时: 8538426400 ns; 平均耗时: 214157920
3.结论
for()
循环 和 IntStream.forEach()
循环 没有性能差距。但是如果IntStream后面加上parallel()的并行流操作,可以根据CPU的内核数量成倍地提升速度。我的CPU是8核的,所以IntStream.parallel().forEach()
的运行速度提升了8倍。