【问题标题】:Excel Function called from C# running slowly从 C# 调用的 Excel 函数运行缓慢
【发布时间】:2012-10-14 07:44:41
【问题描述】:

我有一个方法CalculateLinearRegression() 调用Excel.Application.WorksheetFunction 类的LinEst 函数。每次调用 CalculateLinearRegression() 时,LinEst 会被调用大约 3,500 次。我将 WorksheetFunction 类注入到我的方法中,因此我知道只创建了该类的一个实例。

CalculateLinearRegression() 的每次调用大约需要 10 分钟,我确信是 LinEst 函数正在减慢速度(删除对 LinEst 的调用并对结果进行硬编码意味着该方法可以在一对夫妇中运行秒)。

我很欣赏LinEst 正在做相当多的计算,但我怀疑它做的太多会导致这种延迟,因此我认为可能是对 Excel 函数的调用增加了延迟。有谁知道加快速度的方法,还是直接用 C# 替代 LinEst 函数?

【问题讨论】:

  • 你有没有分析过它?它可能是互操作的阻碍,但由于方法是fairly well documented,您是否考虑过自己重新实现它?
  • 你可以调用一个宏/使用定义的函数而不是多次调用。
  • 是的。如果这是您进行 3500 次的互操作转换,那么您最好尽可能进行一次转换,并按照 Weismat 的建议调用宏。

标签: c# excel vba math


【解决方案1】:

有一些 LinEst 的替代 C# 实现,但我不能直接保证。例如这里有一个讨论:What is the C# equivalent to LINEST from Excel?

我也想为您的长期运行功能添加一些支持,但您的问题中没有足够的信息来发表评论。你能发布它的样子吗?只是 Excel 调用让一切变慢了吗?

【讨论】:

    【解决方案2】:

    我个人会避免使用 Excel 互操作,除非您绝对需要(例如,将文件保存为二进制 MS excel 格式)。自动化 Excel 在性能方面涉及一些相当可怕的成本。

    如果您只需要 LINEST 提供的功能,请考虑使用以下文章中的代码: http://www.codeproject.com/Articles/25335/An-Algorithm-for-Weighted-Linear-Regression 虽然我自己没用过代码,但这篇文章似乎评价很高。

    【讨论】:

      【解决方案3】:

      对 Excel 对象模型(如 WorksheetFunction)的每次调用都必须通过 Interop-Com。由于 Interop 的开销很高,因此多次调用很慢。

      一个简单的解决方案可能是使用 Excel-DNA 切换到 XLL 界面(速度快很多倍)。

      【讨论】:

        猜你喜欢
        • 2021-12-19
        • 2015-06-04
        • 2016-10-21
        • 2018-10-24
        • 2017-05-12
        • 1970-01-01
        • 2020-05-06
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多