0
点赞
收藏
分享

微信扫一扫

在Kotlin代码中要慎用Java 8 的 Stream API


因为会有性能损失。

测试代码:

1.Java 中直接使用 Java 8 的 Stream API:

package i;

import java.util.ArrayList;
import java.util.List;
import java.util.Random;

/**
* @author: Jack
* 2020-05-06 16:20
*/
public class StreamParallelDemo {
public static void main(String[] args) {
System.out.println(String.format("本计算机的核数:%d", Runtime.getRuntime().availableProcessors()));

Random random = new Random();
List<Integer> list = new ArrayList<>(100000000);

for (int i = 0; i < 100000000; i++) {
list.add(random.nextInt(100));
}

long s = getCurrentTime();
Integer ans = list.stream().reduce((a, b) -> a + b).get();
System.out.println(ans);
System.out.println(String.format("单线程计算耗时:%d ms", getCurrentTime() - s));

s = getCurrentTime();
ans = list.stream().parallel().reduce((a, b) -> a + b).get();
System.out.println(ans);
System.out.println(String.format("多线程计算耗时:%d ms", getCurrentTime() - s));

}

private static long getCurrentTime() {
return System.currentTimeMillis();
}
}

运行结果:

本计算机的核数:12
655269092
单线程计算耗时:3350 ms
655269092
多线程计算耗时:425 ms

2.Kotlin 使用 Java 8 的 Stream API:

package i

import java.util.*

/**
* @author: Jack
* 2020-05-06 16:03
*/

fun main() {
val n = 100000000
val random = Random()
val numbers = ArrayList<Int>(n)

for (i in 0..n - 1) {
numbers.add(random.nextInt(100))
}

run {
val s = System.currentTimeMillis()
val ans = singleSum(numbers)
val t = System.currentTimeMillis()
println(ans)
println("singleSum Time:${t - s}ms")
}
}

fun singleSum(numbers: List<Int>): Int {
return numbers.stream().reduce { t: Int, u: Int -> t + u }.get()
}

运行结果:

655113317
singleSum Time:3509ms

package i

import java.util.*

/**
* @author: Jack
* 2020-05-06 16:03
*/

fun main() {
val n = 100000000
val random = Random()
val numbers = ArrayList<Int>(n)

for (i in 0..n - 1) {
numbers.add(random.nextInt(100))
}

run {
val s = System.currentTimeMillis()
val ans = parallelSum(numbers)
val t = System.currentTimeMillis()
println(ans)
println("parallelSum Time:${t - s}ms")
}
}

fun parallelSum(numbers: List<Int>): Int {
return numbers.stream().parallel().reduce { t: Int, u: Int -> t + u }.get()
}

运行结果:
655149583
parallelSum Time:2911ms

看起来,Kotlin使用Java 8 的 parallel Stream API,似乎没有明显的性能提升(猜测:中间有Java-Kotlin互转带来的性能损耗?)。

3.直接使用Kotlin的 List的API:

package i

import java.util.*

/**
* @author: Jack
* 2020-05-06 16:03
*/

fun main() {
val n = 100000000
val random = Random()
val numbers = ArrayList<Int>(n)

for (i in 0..n - 1) {
numbers.add(random.nextInt(100))
}

run {
val s = System.currentTimeMillis()
val ans = listSum(numbers)
val t = System.currentTimeMillis()
println(ans)
println("listSum Time:${t - s}ms")
}
}

fun listSum(numbers: List<Int>): Int {
return numbers.stream().parallel().reduce { t: Int, u: Int -> t + u }.get()
}

运行结果:
655344706
listSum Time:3235ms

4.使用Kotlin的Sequence API

package i

import java.util.*

/**
* @author: Jack
* 2020-05-06 16:03
*/

fun main() {
val n = 100000000
val random = Random()
val numbers = MutableList(n) { random.nextInt(100) }

run {
val s = System.currentTimeMillis()
val ans = sequenceSum(numbers)
val t = System.currentTimeMillis()
println(ans)
println("sequenceSum Time:${t - s}ms")
}
}

fun sequenceSum(numbers: List<Int>): Int {
return numbers.asSequence().reduce { t: Int, u: Int -> t + u }
}

运行结果:

655104311
sequenceSum Time:3176ms

思考题

为什么会有性能损失呢?

Kotlin开发者社区





在Kotlin代码中要慎用Java 8 的 Stream API_中间件


专注分享 Java、 Kotlin、Spring/Spring Boot、MySQL、redis、neo4j、NoSQL、Android、JavaScript、React、Node、函数式编程、编程思想、"高可用,高性能,高实时"大型分布式系统架构设计主题。

High availability, high performance, high real-time large-scale distributed system architecture design

分布式框架:Zookeeper、分布式中间件框架等
分布式存储:GridFS、FastDFS、TFS、MemCache、redis等
分布式数据库:Cobar、tddl、Amoeba、Mycat
云计算、大数据、AI算法
虚拟化、云原生技术
分布式计算框架:MapReduce、Hadoop、Storm、Flink等
分布式通信机制:Dubbo、RPC调用、共享远程数据、消息队列等
消息队列MQ:Kafka、MetaQ,RocketMQ
怎样打造高可用系统:基于硬件、软件中间件、系统架构等一些典型方案的实现:HAProxy、基于Corosync+Pacemaker的高可用集群套件中间件系统
Mycat架构分布式演进
大数据Join背后的难题:数据、网络、内存和计算能力的矛盾和调和
Java分布式系统中的高性能难题:AIO,NIO,Netty还是自己开发框架?
高性能事件派发机制:线程池模型、Disruptor模型等等。。。

合抱之木,生于毫末;九层之台,起于垒土;千里之行,始于足下。不积跬步,无以至千里;不积小流,无以成江河。

举报

相关推荐

0 条评论