起因
昨天在群里聊到虚拟线程的执行效率问题的时候虽然最后的结论是虚拟线程在针对IO密集型任务时具有很大的优势。但是讨论到虚拟线程和Kotlin 的协程的优势对比的话,这时候所有人都沉默了。所以有了本次的测试
提前声明:本次测试是不严谨的,仅仅是作为在群里吹水的资本
先说结论(锁定每次并发数量):
- kotlin 的 IO 协程调度器与虚拟线程在CPU和内存方面相差无几,但是虚拟线程CPU使用比Kotlin 的协程要低一些
- 虚拟线程和Kotlin 的执行效率方面也是相差不大,但是本次测试中,协程的数据要比虚拟线程更好一些
- 如果不锁定每次并发数量,虚拟线程应该是比协程更具有优势的,不过这部分没有测试
此外呢,对于单线程上开启多个协程来说,适当的使用 yield 能尽可能的加快执行效率。对比单线程来说提升接近一倍
测试方法
关于测试方法呢,就是在服务器部署一个HttpService ,在本地使用JDK的 HttpConnection 进行并发访问。具体可以查看 GIthub 中的代码,本次代码也是提交到了 Github。点击跳转到Github
GIthub 上的代码参考自
Sulong
本次针对以下的代码进行了测试:
1. useIoCoroutines:使用协程进行I/O操作。
2. useThreadPool:使用线程池。
3. useVirtualThread:使用虚拟线程。
4. useVirtualThreadCoroutines:使用虚拟线程和协程。
5. useMultithreading:使用多线程。
6. useCpuCoroutines:使用CPU协程。
4. useSingleThreadWithCpuCoroutines:使用单线程与CPU协程。
8. useSingleThreadWithVirtualThreadCoroutines:使用单线程与虚拟线程协程。
9. useSingleThreadWithIoCoroutines:使用单线程与I/O协程。
10. useSingleThreadMultiCoroutinesV2:使用单线程与多个协程(版本2 使用 yield)。
11. useSingleThreadMultiCoroutinesV1:使用单线程与多个协程(版本1)。
12. useSingleThread:使用单线程。
测试结果与数据
结果数据:
Host : *****
Task count: 3000
Thread count: 128
Test type: 1
Test type name: useMultithreading
Test times: 10
--------------------------------------------------------
Total time: 27405
Average time: 2740.5
Minimum time: 1329
Maximum time: 3685
--------------------------------------------------------
Start Time: 2025-01-25T17:00:33.319160700
End Time: 2025-01-25T17:01:00.733020200
===============================================================
--------------------------------------------------------
Host : *****
Task count: 3000
Thread count: 128
Test type: 2
Test type name: useThreadPool
Test times: 10
--------------------------------------------------------
Total time: 18926
Average time: 1892.6
Minimum time: 1220
Maximum time: 3812
--------------------------------------------------------
Start Time: 2025-01-25T17:15:23.926063700
End Time: 2025-01-25T17:15:42.868591900
===============================================================
--------------------------------------------------------
Host : *****
Task count: 3000
Thread count: 128
Test type: 3
Test type name: useSingleThread
Test times: 10
--------------------------------------------------------
Total time: 277412
Average time: 27741.2
Minimum time: 24315
Maximum time: 32107
--------------------------------------------------------
Start Time: 2025-01-25T18:24:34.393491500
End Time: 2025-01-25T18:29:11.812374300
--------------------------------------------------------
===============================================================
--------------------------------------------------------
Host : *****
Task count: 3000
Thread count: 128
Test type: 4
Test type name: useSingleThreadMultiCoroutinesV1
Test times: 10
--------------------------------------------------------
Total time: 275976
Average time: 27597.6
Minimum time: 20722
Maximum time: 43420
--------------------------------------------------------
Start Time: 2025-01-25T18:15:19.202151800
End Time: 2025-01-25T18:20:39.986969900
--------------------------------------------------------
===============================================================
--------------------------------------------------------
Host : *****
Task count: 3000
Thread count: 128
Test type: 5
Test type name: useSingleThreadMultiCoroutinesV2
Test times: 10
--------------------------------------------------------
Total time: 251679
Average time: 25167.9
Minimum time: 17033
Maximum time: 36262
--------------------------------------------------------
Start Time: 2025-01-25T17:41:49.233527400
End Time: 2025-01-25T17:46:02.762644200
--------------------------------------------------------
===============================================================
--------------------------------------------------------
Host : *****
Task count: 3000
Thread count: 128
Test type: 6
Test type name: useIoCoroutines
Test times: 10
--------------------------------------------------------
Total time: 14920
Average time: 1492.0
Minimum time: 1158
Maximum time: 1854
--------------------------------------------------------
Start Time: 2025-01-25T17:48:36.554294
End Time: 2025-01-25T17:48:52.094302400
--------------------------------------------------------
===============================================================
--------------------------------------------------------
Host : *****
Task count: 3000
Thread count: 128
Test type: 7
Test type name: useCpuCoroutines
Test times: 10
--------------------------------------------------------
Total time: 45667
Average time: 4566.7
Minimum time: 3963
Maximum time: 5198
--------------------------------------------------------
Start Time: 2025-01-25T17:52:36.241419600
End Time: 2025-01-25T17:53:25.787347
--------------------------------------------------------
===============================================================
--------------------------------------------------------
Host : *****
Task count: 3000
Thread count: 128
Test type: 8
Test type name: useSingleThreadWithIOCoroutines
Test times: 10
--------------------------------------------------------
Total time: 141554
Average time: 14155.4
Minimum time: 8813
Maximum time: 50318
--------------------------------------------------------
Start Time: 2025-01-25T18:07:12.695241300
End Time: 2025-01-25T18:09:34.301972900
--------------------------------------------------------
===============================================================
--------------------------------------------------------
Host : *****
Task count: 3000
Thread count: 128
Test type: 9
Test type name: useSingleThreadWithCpuCoroutines
Test times: 10
--------------------------------------------------------
Total time: 84003
Average time: 8400.3
Minimum time: 7557
Maximum time: 9253
--------------------------------------------------------
Start Time: 2025-01-25T18:10:03.623195400
End Time: 2025-01-25T18:11:27.669269100
--------------------------------------------------------
===============================================================
--------------------------------------------------------
Host : *****
Task count: 3000
Thread count: 128
Test type: 10
Test type name: useSingleThreadWithVirtualThreadCoroutines
Test times: 10
--------------------------------------------------------
Total time: 93342
Average time: 9334.2
Minimum time: 8146
Maximum time: 11236
--------------------------------------------------------
Start Time: 2025-01-25T18:12:04.634681400
End Time: 2025-01-25T18:13:38.021356900
--------------------------------------------------------
===============================================================
--------------------------------------------------------
Host : *****
Task count: 3000
Thread count: 128
Test type: 11
Test type name: useVirtualThreadCoroutines
Test times: 10
--------------------------------------------------------
Total time: 23266
Average time: 2326.6
Minimum time: 1344
Maximum time: 3613
--------------------------------------------------------
Start Time: 2025-01-25T18:14:17.870239100
End Time: 2025-01-25T18:14:42.339861900
--------------------------------------------------------
===============================================================
--------------------------------------------------------
Host : *****
Task count: 3000
Thread count: 128
Test type: 12
Test type name: useVirtualThread
Test times: 10
--------------------------------------------------------
Total time: 22886
Average time: 2288.6
Minimum time: 1246
Maximum time: 3822
--------------------------------------------------------
Start Time: 2025-01-25T18:06:04.298736200
End Time: 2025-01-25T18:06:27.193677200
--------------------------------------------------------
执行时间分析
最短总时间:useIoCoroutines(14920ms)
最长总时间:useSingleThread(277412ms)
最高平均时间:useSingleThread(27741.2ms)
最低平均时间:useIoCoroutines(1492.0ms)