【问题标题】:Which iteration method reading Excel values will be more performant?哪种迭代方法读取 Excel 值会更高效?
【发布时间】:2013-07-03 14:46:34
【问题描述】:

由于 CodeReview 不允许 sn-p-comparison,我在这里问我的问题。如果这不符合 SO 规则,我深表歉意,但我无法测试或基准测试我的问题。

这里...我目前有以下工作代码:

string currentValue, valueToFind;

for (int i = 1; i <= rows; i++)
{
    currentValue = source.CellValueString(i, 1);

    for (int j = 2; j <= localRows; j++)
    {
        valueToFind = target.CellValueString(j, 4);

        if (valueToFind == currentValue)
        {
            //Set Excel cell value
            break;
        }
    }
}

请注意,rowslocalRows 通常具有大约 300 的值,这意味着最多 90.000 次迭代。 sourcetarget 是用于处理 Excel 对象的自定义类的实例。 CellValueString() 方法仅用于获取单元格的字符串值。我在想也许下面的代码可能会更高效:

//GetValues() would be a method to get the values of the given range
string[] values = source.GetValues("A1:A" + rows);
string[] valuesToCompare = target.GetValues("D2:D" + localRows);

foreach(string currentValue in values)
{
    foreach(string valueToFind in valuesToCompare)
    {
        if(valueToFind == currentValue)
        {
            //Set Excel cell value
            break;
        }
    }
}

当一次获取所有值时,第二种方法是否比迭代更快,并且在每次迭代时从 Excel 中获取值进行比较?

欢迎任何其他提高性能的方法!

【问题讨论】:

  • 你没有办法执行你的代码?我建议在开头放一个秒表,最后输出经过的时间来比较结果。
  • 秒表不是一个选项。这是在 InfoPath 表单后面执行的代码。

标签: c# performance excel com iteration


【解决方案1】:

您可以通过添加以下内容来衡量您的代码的性能(对不起,我只做 VBA,但原理应该在 VC 中也可以使用):

[A1] = Now()

' your code goes here

[A2] = Now()

这会将被测代码块之前和之后的系统时间记录到当前工作表的单元格 A1 和 A2 中。最重要的是,在 [A3] 中输入公式 =(A2-A1)*86400 以秒显示时差(包括小数位)。

根据我的经验,范围内的大规模操作(即For Each x In y)往往比离散循环快(很多)。

【讨论】:

  • 你最后一句话是什么意思?获取质量值(通过 Range)比每次迭代获取单个单元格值更快?
  • 利用 Excel 的集合对象和 foreach 通常比遍历具有通用 for/while/loop 结构的单元格更快......例如根据我的经验,你的第二个会比你的第一个快
  • 我使用 Kim 的提示(评论)来分析执行时间,并且在内存中使用 Range 确实比循环单个单元格值快很多。
猜你喜欢
  • 2019-11-22
  • 2015-11-03
  • 1970-01-01
  • 2012-01-20
  • 2012-06-15
  • 1970-01-01
  • 2010-10-17
  • 2011-08-15
  • 1970-01-01
相关资源
最近更新 更多