用例1:提交512个串行队列任务后,主线程休眠6s
for (size_t i = 0; i < 512; I++)
{
uint64_t tsc = arm64_cnt_vct();
// 每个任务一个独立串行队列,提交后释放即可
char label[64];
snprintf(label, sizeof(label), "com.benchmark.serial.%zu", i);
dispatch_queue_t q = dispatch_queue_create(label, dispatch_queue_attr_make_with_qos_class(DISPATCH_QUEUE_SERIAL, qos, 0));
dispatch_async(q, ^{
TRACE_COUNT("cnt_delay", arm64_cnt_vct() - tsc);
run_task(type, cost);
});
}
usleep(6000000);

worker类型1:Idle满5s后退出

worker类型2:执行完任务后直接退出
结果统计:
说明:
- 63个worker走的超时退出,1个worker保持不退出,其余448个worker由于超编直接退出
- worker idle的时长都是5s左右,因为timer到期后,触发worker销毁会带动下一个worker销毁,链式完成
[idle_then_terminate] last_idle_span: min=5060.00ms median=5060.00ms max=6120.00ms
[idle_then_terminate] last_idle_span 直方图:
0-1ms 0
1-5ms 0
5-10ms 0
10-20ms 0
20-50ms 0
50-100ms 0
100-200ms 0
200-500ms 0
500-1000ms 0
1-1.5s 0
1.5-2s 0
2-2.5s 0
2.5-3s 0
3-3.5s 0
3.5-4s 0
4-4.5s 0
4.5-5s 0
5-5.5s 63 ###############################################################
>5.5s 1 #
用例2:向多个串行队列周期性提交任务,最后主线程睡眠6秒
for (size_t i = 0; i < 512; i++) {
dispatch_queue_t queue = queues[i];
controllers.emplace_back([queue, iterations, cost_us, cycle_gap_us] {
for (size_t k = 0; k < iterations; k++) {
usleep((useconds_t)cycle_gap_us);
uint64_t tsc = arm64_cnt_vct();
dispatch_async(queue, ^{
TRACE_COUNT("cnt_delay", arm64_cnt_vct() - tsc);
run_task(2, cost_us);
});
}
});
}

现象1:睡眠4.6秒后退出

现象2:睡眠2.8秒

现象2:睡眠954.46ms
结果统计:
0-1ms 3
1-5ms 11 #
5-10ms 2
10-20ms 1
20-50ms 1
50-100ms 0
100-200ms 1
200-500ms 0
500-1000ms 3
1-1.5s 3
1.5-2s 5 #
2-2.5s 3
2.5-3s 4 #
3-3.5s 6 #
3.5-4s 8 #
4-4.5s 5 #
4.5-5s 7 #
5-5.5s 6 #
>5.5s 80 ########