在效率下降之前可以产生多少个线程?
是否有任何公式,可能涉及的CPU数量,这可以给我一个粗略的想法,我可以产生多少线程之前,它开始效率低下,并减慢PC?在效率下降之前可以产生多少个线程?
我想加载测试另一台机器,所以想发送请求像pobile一样快。但是,如果他们能够彼此相处,就不会产生一百万个线程。
编辑:线程正在进行远程过程调用(SOAP),所以会阻塞等待呼叫返回。
这取决于线程正在做什么。如果他们在做计算,那么这个数字会更低。如果他们在等待I/O,那么你可以有更多。
但是,如果他们在等待I/O,那么使用异步I/O API可能会比使用多线程更好地实现相同的结果。
+1 Thnaks。他们正在进行远程过程调用(SOAP) – Mawg 2010-09-21 09:08:22
首先启动一个线程本身可能是一个相当慢的操作。当你启动一个线程时,必须分配堆栈空间,DLL中的入口点可能会被调用等。如果你的线程多于可用内核,那么大多数线程在任何给定时刻都不会运行。即他们使用资源并且没有贡献。
很难给出确切数量的线程以获得最佳性能,因为它取决于线程在做什么,但通常不应超出可用内核数量。请记住,您不能拥有比可用内核数量更多的运行线程。
如果所有线程都处于活动状态并且没有阻塞等待某些事情,那么基本上每个CPU有一个线程(真正的内核)。除此之外,您还依赖操作系统在给定CPU上的线程之间进行上下文切换。
但这一切都取决于线程正在做什么。如果他们大部分时间都在睡觉,或者正在等待异步IO操作,那么您大多只需要担心用于堆栈的内存,我相信每个线程的默认值大约为1MB。
其他答案当然是正确的; “这取决于”。如果线程忙于执行CPU密集型工作,那么拥有超过可用内核数量的点并不重要。但假设他们正在等待外部结果,它可能差别很大。
我经常发现这个问题是由应用程序的体系结构和需求来回答的;你需要尽可能多的线程。但如果你可能拥有无限数量的线程,你可能会产卵,我认为这可能听起来像是我自己的ThreadPool任务;让它决定有多少线程实际上正在运行。
+1 Thnaks。他们正在进行远程过程调用(SOAP)。Threadpool听起来不错,因为我可以在运行时放弃每个线程的启动成本;初始化池,然后让开始线程。 – Mawg 2010-09-21 09:10:23
VS2008与这个问题并不真正相关,但如果您可以使用您将要使用的语言/库标记问题将会有所帮助。 – 2010-09-21 03:53:39
+1谢谢。无论是VB还是C# – Mawg 2010-09-21 09:10:49