从上面的答案来看,意味着如果在我的线程中有创建对象,我将面临内存分配/解除分配瓶颈,因此运行线程可能较慢或没有明显的时间采取差异。比没有线程。如果我不能分配内存来为我的线程中的计算创建对象,那么在应用程序中运行多线程的优点是什么?
答案 0 :(得分:9)
如果我无法分配内存来为我的线程中的计算创建对象,那么在应用程序中运行多线程有什么好处?
这取决于你的瓶颈所在。如果你的瓶颈是可用内存量,那么创建更多线程将无济于事。或者,如果I / O是一个瓶颈,尝试并行化只会因为上下文切换而略微减慢速度。这就像试图通过在其中加入更宽的轮胎来更快地制造动力不足的汽车:修复错误的东西并没有帮助。
当瓶颈是处理器并且有多个处理器可用时,线程很有用。
答案 1 :(得分:2)
好吧,如果你在一个循环中分配内存块,事情会变慢。
如果您可以在TThread.execute开头创建一次对象,则开销会更小。
如果您必须等待IO操作,或者如果您在具有多个物理核心的计算机上进行昂贵的计算,那么线程也可能是有益的。
答案 2 :(得分:1)
如果你有内存密集型线程(许多内存分配/解除分配),你最好使用TopMM而不是FastMM: http://www.topsoftwaresite.nl/
FastMM使用一个锁定所有其他线程的锁,TopMM不会这样,它在多核/ cpus上的扩展性更好!
答案 3 :(得分:0)
当谈到多线程时,总会出现共享资源问题(使用当前技术)。所有可能需要序列化的资源(RAM,磁盘等)都是可能的瓶颈。多线程不是一种魔术解决方案,可以快速转换缓慢的应用程序,而不是总能带来更好的速度。以错误的方式制造,实际上可能导致更快的速度。应该分析它以找到可能的瓶颈,并且可能需要重写一些部分以使用不同的技术(即预分配存储器,使用异步I / O等)来最小化瓶颈。无论如何,性能只是使用多个线程的原因之一。还有其他几个原因,例如让用户能够与应用程序交互,而后台线程在不“锁定”用户的情况下执行操作(即打印,检查数据等)。应用程序看起来“更快”(用户可以继续使用它而无需等待),即使它实际上更慢(完成操作所需的时间比连续生成的要多)。