【发布时间】:2013-08-07 01:18:50
【问题描述】:
我使用 C# 作为研究工具,并且经常需要运行 CPU 密集型任务,例如优化。从理论上讲,我应该能够通过多线程我的代码来获得很大的性能改进,但在实践中,当我使用与工作站上可用的内核数相同的线程数时,我通常会发现 CPU 仍然只运行在 25最大的 %-50%中断代码以查看所有线程在做什么强烈表明内存分配是瓶颈,因为大多数线程将等待new 语句执行。
一种解决方案是尝试重新设计我的所有代码以提高内存效率,但这将是一项艰巨且耗时的任务。但是,由于我的工作站上有大量内存,我想知道是否可以通过设置不同的线程来回避这个问题,以便它们每个都有自己的私有内存池来工作。当然,有些对象仍然需要在所有线程之间公开,否则无法为每个线程指定任务或获取结果。
有谁知道这种方法在 C# 中是否可行,如果可以,我应该怎么做?
【问题讨论】:
-
内存管理是由.Net框架完成的,你能做的不多。但是,您确定瓶颈不在 IO 或其他子系统中吗?
-
@oscar 是的,我确信这是内存管理,因为我设置了优化问题,所有数据都保存在内存中,所以我的线程都不需要做任何事情IO 随便。这也是合理的,因为只有一个堆可以创建所有对象。
-
你有很多内存并构建 x64 并且仍然有分配作为瓶颈?您看到/期待什么样的内存使用情况?
-
@Stochastically 比这复杂一点。它更像是“如果编译器可以证明引用没有超出范围,它通常会在堆栈上分配”。这适用于类和结构——它仅取决于对象的实际使用情况。不同之处在于,由于结构变量本身传递数据(而不是引用),它们更有可能满足堆栈分配的标准。 (但请记住,这整个事情是依赖于实现的,因为堆栈和堆本身是实现细节。)
-
@Stochasticly 还有
unsafe块,您可以在其中使用stackalloc并明确控制分配发生的位置(但它仅适用于结构实例,不适用于类实例)。确实,这不是一个非常干净的解决方案,尤其是如果它妨碍了代码的语义,这就是我将其作为评论的原因。不过,作为最后的手段,它可能会对您有所帮助。
标签: c# multithreading performance memory-management heap-memory