为何简单C++多线程示例运行速度比单线程更慢?
多线程为何反而比单线程慢?
我正在学习基础C++多线程,为理解相关概念编写了一段测试代码。一直听说多线程运行更快,于是写了如下代码:
int main() { //---- SECTION 1 Timer timer; Func(); Func(); //---- SECTION 2 Timer timer; std::thread t(Func); Func(); t.join(); }
Timer的实现:
Timer() { start = std::chrono::high_resolution_clock::now(); } ~Timer() { end = std::chrono::high_resolution_clock::now(); duration = end - start; //To get duration in MilliSeconds float ms = duration.count() * 1000.0f; std::cout << "Timer : " << ms << " milliseconds\n"; }
运行结果:单线程的Section 1耗时0.1ms-0.2ms;多线程的Section 2耗时1ms及以上,明明多线程应该更快,实际却更慢,希望得到解答,纠正概念误区。
核心原因与概念纠正
- 线程创建存在固定开销:创建
std::thread需要操作系统分配内核资源、初始化线程栈、调度器将线程挂载到CPU核心上,这些操作本身就需要消耗时间(通常在毫秒级)。你的Func()执行时间只有0.1ms左右,线程创建的开销直接盖过了并行执行带来的收益。 - 任务粒度太轻量:多线程的优势体现在任务能真正并行且执行时间足够长的场景。如果任务本身执行时间极短,并行节省的时间远不如线程创建、上下文切换的成本高。比如把
Func()改成执行1秒的计算,多线程版本耗时会接近单线程的一半;但当前任务太轻,完全体现不出并行优势。 - 线程调度的不确定性:多线程版本中,系统需要调度新创建的线程到CPU上执行,这个调度过程存在延迟,加上极短时间的计时本身误差较大,会进一步放大多线程版本的耗时。
- 多线程不是“万能加速”:多线程的加速逻辑是把可并行的任务拆分到多个CPU核心同时执行,但只有当任务的并行收益超过线程管理的开销时,才会比单线程快。对于IO密集型任务(比如等待磁盘、网络响应),多线程可以让CPU在等待时处理其他任务,这也是优势,但你的场景是纯计算且任务太轻,完全不匹配。
内容的提问来源于stack exchange,提问作者Thomas A Mathew
相关产品推荐
相关产品推荐

