在Excel中multithreading计算速度很慢

我想知道是否有任何方法来控制Excel的计算,使WB中的几张纸重新计算并行,而其他的不是。 我的问题是,在目前设置的顺序计算过程,我已经花了太长时间。 这个序列是从VBA驱动的,如下所示:1)VBA调用一个插件(excel-dna vb.net插件,控制数据读取器和附加数据库)2)插件将数据返回到表1.表2-3重新计算按顺序(第2页,然后是第3页)3)第4页到第10页按顺序重新计算,但是由于每个页面独立地只与页面2相连,所以它们理论上可以重新计算 – 但如何做到这一点? 4)再次通过1)中描述的通过vba addin调用新数据开始处理)

在笔记本电脑上运行一个数据子集(64位,32位excel,英特尔i7)需要54.6秒。 有趣的是,如果我closuresmultithreading,它需要25.8秒! 更重要的是,如果我在一台超级快速的机器上运行它(2 x Intel Xeon X5570,四核“Nehalem”架构,64位64位excel),它比我的笔记本电脑要慢,multithreading需要230秒,或者没有26秒。

我想知道是否有更好的方法可以利用多核心和multithreading。 缓慢的位似乎是优秀的重新计算,而不是外加速度。 任何build议感激。

编辑:上面的描述有点简化 – 实际上,我还有一个迭代的“calc / paste-vales / recalc”过程,在每张表4-10上运行(迭代继续进行,直到达到某个所需的灵敏度,只有这样计算完整的表格)。 我相信这使得在当前devise下运行一个wb计算是行不通的。

表4-10是相同的(硬编码input参数除外),彼此之间没有计算依赖关系。 如果每个计算过程(提到的迭代过程和表格计算)可以并行而不是按顺序完成,我认为整个过程会更快。

仅供参考,我已经进行了更为明显的精简和testing(分解公式,分离易失性函数等)。

在整个过程中运行整个数据集大约需要16个小时,这就是为什么我急于find一些方法来改进这一点。

谢谢!

  • 下面是阅读Excel计算性能的一个很好的开始: http : //www.decisionmodels.com/calcsecretsc.htm 。

  • 您可以使用像[ExcelFunction(IsThreadSafe = true)]这样的属性将Excel-DNA函数标记为线程安全,尽pipe这听起来不像这里的瓶颈。 这将允许这些function同时进行评估。

  • 如果您的i7处理器具有超线程(所以它向Windows报告4个内核,但实际上只有两个实际内核),那么将Excel的线程数设置为核心数(比如2)而不是数处理器可以运行的线程数(这可能是Excel的默认值 – 也许是4)。

multithreading计算比单线程计算慢是非常不寻常的。

推测你已经将计算转换为手动。

您是否在每张纸上使用Sheet.Calculate来“按顺序计算工作表”? 如果是这样,使用Application.Calculate可能会更快,并让Excel自动计算重新计算所有工作表的最快方法。