Skip to content

希望通过对比各种语言的执行效率,为寻找适合的解决方案提供一些参考。

License

Notifications You must be signed in to change notification settings

sillyemperor/whoisthefastestlang

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

17 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

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

About

希望通过对比各种语言的执行效率,为寻找适合的解决方案提供一些参考。

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published