我有一个像这样的列的文件:
...
列的长度例如是20000.我使用以下C#代码来移动此列:
while (true)
{
// Find SND
dest_cells = ex_cells.Find("SND", dest_cells, Excel.XlFindLookIn.xlValues, Excel.XlLookAt.xlWhole, Excel.XlSearchOrder.xlByColumns,
Excel.XlSearchDirection.xlNext, false, false, false);
// END?
if (dest_cells.Row < row)
return false;
row = dest_cells.Row;
// Find K
dest_cells = ex_cells.Find("K", dest_cells, Excel.XlFindLookIn.xlValues, Excel.XlLookAt.xlWhole, Excel.XlSearchOrder.xlByColumns,
Excel.XlSearchDirection.xlNext, false, false, false);
// END?
if (dest_cells.Row < row)
return false;
row = dest_cells.Row;
// Some operations
/*there were some operations, but I commented them. So they don't influence on performance*/
}
每次连续搜索的持续时间都在增加。我没有测量时间。但只是为了解释让它成为:首先发现需要0.1秒,第二个0.2秒,第十个1秒,二十个二十秒等等。
为什么呢?我无法理解
答案 0 :(得分:2)
最快的方法取决于你想要做什么操作:但最好的方法是将数据列分配给一个对象数组并进行处理(每个互操作调用的开销都很高) Excel对象模型)。有关各种方法的比较,请参阅http://fastexcel.wordpress.com/2011/10/26/match-vs-find-vs-variant-array-vba-performance-shootout/
答案 1 :(得分:0)
当您进行循环时,您使用dest_cells
作为查找下一个匹配项的起点。但是这个变量在找到K
和找到SND
之间共享,并且这些变量的分布越多(在找到匹配之后),那么代码越需要在增加的区域中循环。使用不同的变量,例如matchK
和matchSnd