启动一个线程并终止它需要数百个机器周期。但这只是一个开始。线程之间的上下文切换(如果线程正在执行任何有用的事情时会发生)将重复消耗更多数百个机器周期。所有这些线程的执行上下文将消耗许多字节的内存,这反过来会弄乱许多行缓存,从而妨碍了CPU在数百个机器周期中的又一个很大的努力。事实上,多任务处理是数百个机器周期的一个重要消费者。多任务处理仅在CPU功耗方面变得有利可图当您设法获得足够的处理器以处理概念上独立的数据块(因此并行处理不会威胁到它们的完整性)并且大到足以显示净收益时与单处理器版本。
在所有其他情况下,多任务处理是在所有域,但一个固有低效:反应。任务可以对外部事件作出快速而准确的反应,最终来自外部H/W组件(无论是定时器的内部时钟还是用于网络流量的WiFi /以太网控制器)。
这种在不浪费CPU的情况下等待外部事件的能力是提高整体CPU效率的原因。就是这样。
在其他性能参数方面(内存消耗时间内核调用内部的浪费,等等),推出一个新的线程是总的净亏损。
概括地说,多任务编程的技术归结为:
- 识别所述外部I/O流,你将不得不处理
- 考虑反应性的要求考虑(记住多个反应性=更少CPU /内存在99%的时间内高效运行)
- 以合理的效率/易于维护的折中方式为所需事件设置处理程序。
多处理器架构正在增加一个新的复杂程度,因为现在任何程序都可以看作是一个拥有许多外部CPU的进程,可以用作额外的电源。但是你的问题似乎没有任何关系。
的多任务处理效率的量度,最终将取决于给定的计划预计以应付同时和一组给定的反应性限制内外部事件数。
最后我来谈谈你的问题。
要应对外部事件,每一个新的树枝或死昆虫的位必须移动周围的蚁丘是一个非常粗糙和低效的进场时间发动的任务。
您在您的处置许多强大的同步工具,这将让你从(近)在(几乎)没有成本最优效率的单个任务范围内的是一帮异步事件的反应。
通常情况下,在多个输入阻塞等待,例如像Unix的口味select()
或微软的WaitForMultipleEvents()
对口。
使用这些会给你一个性能提升无比超过几十个CPU周期,你可以挤出你这个任务的结果收集优化项目的更大。
所以我的答案是:不要打扰优化线程设置。这不是问题。
你最好将时间花在重新考虑你的架构,这样经过深思熟虑的线程少数可以取代无用CPU成群的记忆猪当前的设计会催生。
你不小心一个字?从线程返回值,对吗? –
?你什么意思?是 – Luka
是的,但我想最有效的方式 – Luka