Skip to content

Latest commit

 

History

History
79 lines (52 loc) · 5.26 KB

README.md

File metadata and controls

79 lines (52 loc) · 5.26 KB

Who is the fastest lang

未特殊说明的情况下,所有的测试均在如下环境中进行:

  • 采用的机器

    • 型号名称: 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

1. 网页抓取

假设我们需要访问许多网络连接并处理返回结果,可以不考虑访问顺序。最简单的方法就是一个个访问,优点是代码简单,缺点是速度太慢。要想提高速度就需要使用并发。下面就把几种语言各自的方案分别测试一下,看看效果。Java代码 Python代码

下表中的数值为单次访问平均所需的毫秒数,这里是测试数据

语言 顺序执行 多线程 多进程 异步
Java 379 81 90
Python 1382 344 346 38

首先是Java,可以看见,多线程的效果还是不错的,我使用parallelStream方法来实现多线程调用。异步我对比了HttpAsyncClientVertx Web Client,最后选择了Vertx的执行结果。

Python的由于多线程饱受诟病,所以增加了多进程的方案,异步使用到了aiohttp

经过几次执行,发现Python3的async效果非常好。

2. Hash运算

访问网页更多是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的测试代码是边学边写的,可能有使用不当的情况,之后熟悉了回来重新测试。

3. 图片处理

我用给JPEG图片加水印来测试图片处理的能力。Python使用了Pillow进行图像处理。Java使用的是JDK提供的JAI。Java代码 Python代码

下表中的数值为单次执行所需的平均毫秒数,这里是底图这是用作水印的PNG图

语言 顺序执行 多线程 多进程 异步
Java 40 17
Python 43 18 22

可以看到这一次Java和Python的执行时间是相似的,Pillow使用了C来实现图像处理。Java的JAI框架默认安装的是纯Java实现的,但是可以在官网下载本地代码的实现,应该可以进一步提高性能。

4. Json

本测试先对一个Json字符串反序列化,然后再序列化。Python采用了ujson,Java使用的是Jackson,Rust使用的是jsonJava代码 Python代码 Rust代码

下表中的数值为单次执行所需的平均毫秒数,这里是测试数据

语言 顺序执行 多线程 多进程 异步
Java 0.08 0.04
Python 0.14 0.16 0.07
Rust 0.07 0.03