采用的机器
- 型号名称: MacBook Pro
- 处理器名称: Intel Core i5
- 处理器速度: 3.1 GHz
- 处理器数目: 1
- 核总数: 2
- 内存: 8 GB
采用的Java版本:
- Java HotSpot(TM) 64-Bit Server VM (build 25.162-b12, mixed mode)
采用的Python版本:
- Python 3.7.3
采用的Rust版本:
- rustc 1.37.0
假设我们需要访问许多网络连接并处理返回结果,可以不考虑访问顺序。最简单的方法就是一个个访问,优点是代码简单,缺点是速度太慢。要想提高速度就需要使用并发。下面就把几种语言各自的方案分别测试一下,看看效果。Java代码 Python代码
下表中的数值为单次访问平均所需的毫秒数,这里是测试数据
语言 | 顺序执行 | 多线程 | 多进程 | 异步 |
---|---|---|---|---|
Java | 379 | 81 | 无 | 90 |
Python | 1382 | 344 | 346 | 38 |
首先是Java,可以看见,多线程的效果还是不错的,我使用parallelStream方法来实现多线程调用。异步我对比了HttpAsyncClient和Vertx Web Client,最后选择了Vertx的执行结果。
Python的由于多线程饱受诟病,所以增加了多进程的方案,异步使用到了aiohttp。
经过几次执行,发现Python3的async效果非常好。
访问网页更多是IO操作,CPU等待。Hash运算就不同了。我选择使用SHA256进行测试。具体的做法就是多次对一段文本进行hash运算。Java代码 Python代码 Rust代码
下表中的数值为单次执行所需的平均毫秒数,这里是测试数据
语言 | 顺序执行 | 多线程 | 多进程 | 异步 |
---|---|---|---|---|
Java | 11 | 5 | 无 | 无 |
Python | 4 | 2 | 2 | 5 |
Rust | 10 | 5 | 无 | 无 |
很意外的Java居然比Python要慢一些,其实只要深入代码会发现,Python使用了C代码,而Java没有这样做。 Rust的测试代码是边学边写的,可能有使用不当的情况,之后熟悉了回来重新测试。
我用给JPEG图片加水印来测试图片处理的能力。Python使用了Pillow进行图像处理。Java使用的是JDK提供的JAI。Java代码 Python代码
下表中的数值为单次执行所需的平均毫秒数,这里是底图,这是用作水印的PNG图
语言 | 顺序执行 | 多线程 | 多进程 | 异步 |
---|---|---|---|---|
Java | 40 | 17 | 无 | 无 |
Python | 43 | 18 | 22 | 无 |
可以看到这一次Java和Python的执行时间是相似的,Pillow使用了C来实现图像处理。Java的JAI框架默认安装的是纯Java实现的,但是可以在官网下载本地代码的实现,应该可以进一步提高性能。
本测试先对一个Json字符串反序列化,然后再序列化。Python采用了ujson,Java使用的是Jackson,Rust使用的是json。Java代码 Python代码 Rust代码
下表中的数值为单次执行所需的平均毫秒数,这里是测试数据。
语言 | 顺序执行 | 多线程 | 多进程 | 异步 |
---|---|---|---|---|
Java | 0.08 | 0.04 | 无 | 无 |
Python | 0.14 | 0.16 | 0.07 | 无 |
Rust | 0.07 | 0.03 | 无 | 无 |