【发布时间】:2013-10-16 16:43:00
【问题描述】:
我很感兴趣在 Java、C# 和 C++ 中创建线程的实际成本是多少?我知道当线程在创建时必须完成一堆操作:分配线程堆栈,初始化描述符等。
但我对实际成本很感兴趣。 C# 和 Java 使用不同的 VM 和不同的 JIT,而 C++ 执行本机代码。因此,所有这些语言的线程创建时间都不同。我还听说在 Java 中创建线程比在 C# 中慢得多。有人可以就这个问题给出权威的答案和解释吗?
【问题讨论】:
-
一般来说,权威的回答是“如果线程creation是你应用程序的瓶颈,那么你做错了”。您不应该如此频繁地创建和销毁线程,以免造成任何 的不同。如果您有许多频繁启动和停止的短期任务,请使用线程池。
-
@jalf:有时您需要在依次执行两个任务和将第二个任务作为新线程启动之间进行选择,这样它就不会阻塞当前线程或被第一个任务阻塞。您感兴趣的是哪个可以最快地完成工作和哪个可以最好地利用 CPU。了解启动新线程的成本可以帮助您做出决定。
-
@RalphChapin 请重新阅读我的评论。我没有说“按顺序做所有事情”,我说您可以并行运行它们,而无需为每个任务启动一个新线程。这就是线程池的用途。您可以并行运行任务而不会产生产生新线程的成本。
-
“让一堆线程闲置”不会消耗内存。在最坏的情况下,它会消耗一些地址空间。但是,是的,任何事情都需要权衡取舍。我的观点很简单,如果你如此频繁地启动新线程以至于线程启动成本很重要,那么你不应该这样做,而是重用现有线程——例如通过线程池。
-
这不是特定于实现的吗?
标签: c# java c++ multithreading performance