# ThreadSafeFunctionPerf **Repository Path**: kkup180/thread-safe-function-perf ## Basic Information - **Project Name**: ThreadSafeFunctionPerf - **Description**: 用来测试跨线程调用的函数性能 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: main - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 1 - **Forks**: 1 - **Created**: 2023-12-21 - **Last Updated**: 2025-08-05 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README ### 测试用例 测试 case: 1. 从 C++ 任意线程切换到主线程执行方法并拿到返回值的耗时 2. 通过 C++ 调到 Worker 线程,由 Worker 线程执行方法并拿到返回值的耗时 3. 通过 C++ 调到 Worker 线程,由 Worker 线程转发到主线程执行方法并拿到返回值的耗时 变量:数据量大小、主线程繁忙程度、执行方法耗时 方式:napi 为了评估API调用在主线程还是worker线程实现,编写了以下测试用例场景: ![输入图片说明](docs/images/Untitled-2022-10-28-1635.png) 测试用例在C++临时线程发起,调用 napi_call_threadsafe_function 函数,他会异步调度到 threadsafe_function 所在线程上运行,临时线程进行同步等待,threadsafe_function 所在线程执行完结果后,会通知临时线程继续往下运行。如图所示:整体耗时 Total = Schedule + napi_call_function + notify 三个测试用例: Case1. 主线程执行两个string拼接,并且返回结果; Case2. worker线程执行两个string拼接,并且返回结果; Case3. worker线程同步调用主线程执行两个string拼接,并且返回结果; 两个变量因子: 1. 主线程负载:采用每隔8ms执行Fibonacci函数,并且不断刷新uuid字符串,Fibonacci(21)耗时在2ms左右,即一般负载,Fibonacci(25)耗时在7ms左右,即重负载; ``` Text(this.loadMessage) .fontSize(10) .fontWeight(FontWeight.Bold) ... function Fibonacci(n:number):number { if (n === 1) { return 1; } if (n === 2) { return 1; } return Fibonacci(n - 1) + Fibonacci(n - 2); } Fibonacci(21) this.loadMessage = util.generateRandomUUID(true); ... ``` 2. 函数调用字符串长度:'Hello' + 'World' = 'HelloWorld', 500个char + 500个char = 1000个char, 5k个char + 5k个char = 10k个char, 50k个char + 50k个char = 100k个char, 500k个char + 500k个char = 1000k个char 这四种场景 ### 测试结果 测试主线程负载的影响:20次,取平均值,单位是us | | 空载 | 一版负载 | 重载 | |---|---|---|---| | Case1 | 795 | 2645 | 8667 | | Case2 | 1578 | 1424 | 1282 | | Case3 | 3721 | 5233 | 8005 | ![输入图片说明](docs/images/%E7%BB%9F%E8%AE%A1%E7%BB%93%E6%9E%9C.png) 说明随着主线程负载的增加,API调用耗时会逐渐增加。 测试字符串长度的影响:20次,空载场景,取平均值,单位是us | | HelloWorld | 1000个char | 10k个char | 100k个char | 1000k个char | |---|-------------|---|---|---|---| | Case1 | 791 | 795 | 1036 | 1466 | 5652 | | Case2 | 1578 | 1564 | 1354 | 2494 | 9537 | | Case3 | 3721 | 3255 | 3663 | 5209 | 28070 | 字符串长度在100K以下对耗时影响较小,在1000K级别有明显的耗时增加。