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

我一直试图通过使用XLL来加速macros,但是,对于UDF而言,使用XLL似乎要快得多。

有些代码分析的数据certificate了这一点

XLL时间为子Proc:模块1迭代11.64831秒

UDF时间为子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 

两者都testing范围(A1:A701)的数据和细胞之间的空白,两者都按预期工作,只是XLL较慢。

  1. VBA直接访问单元格内容。 它使用它的本地types,99%的时间,一个编码良好的UDF将比做同样事情的外部库更快。

  2. 在你的例子中,你正在做更多的C#版本。

  3. 如果你真的想提高性能,并利用C#能力来做没有循环的东西*你应该考虑传递一个Range对象到你的外部库,假装你正在传递一维数组 。 接受,在C#中,你很好去像LINQ的所有酷的东西。