为什么我的XLL比我的UDF慢?

时间:2015-03-10 05:55:56

标签: c# excel excel-dna xll excel-udf

我一直试图通过使用XLL来加速宏,但是,使用UDF似乎比使用XLL快得多。

一些带代码分析的数据演示了它

XLL 潜艇的时间 Proc:模块1迭代 11.64831秒

UDF sub的时间 Proc:模块1迭代 4.25986秒

它发生在我转换的两个UDF上,因子是2倍或3倍慢。 例如,XLL函数是:

[ExcelFunction(Description="Joins cell values", Category="Example1")]
public static object RangeJoin(object[,] cells)
{
List<string> list = new List<string>();
foreach (object o in cells){      
if ( !(o is ExcelEmpty) )
list.Add(o.ToString()); }
return string.Join(" ", list.ToArray());

}

UDF功能

Function RangeJoin(Rng As Range) As String
Dim vArr As Variant
Dim v As Variant
vArr = Rng

RangeJoin = vbNullString

For Each v In vArr
  RangeJoin = RangeJoin & " " & v
 Next v

End Function

两个都测试了Range(A1:A701)的数据和单元格之间的空白,两者都按预期工作,只是XLL更慢。

1 个答案:

答案 0 :(得分:2)

  1. VBA直接访问单元格内容。它使用其原生类型,99%的情况下,编码良好的UDF将比执行相同操作的外部库更快。

  2. 在您的示例中,您正在使用C#版本执行更多操作。

  3. 如果你真的想提高性能并利用C#的能力来做事而不循环*,你应该考虑passing a Range object to your external library pretending like you're actually passing a 1D array。在C#中接收它,你可以选择LINQ等所有很酷的东西。