为什么我的 XLL 比我的 UDF 慢

本文关键字:我的 UDF XLL 为什么 | 更新日期: 2024-11-06 11:02:24

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

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

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

子的UDF时间进程:模块 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 速度较慢。

为什么我的 XLL 比我的 UDF 慢

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

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

  3. 如果您确实想提高性能并利用 C# 功能在不循环的情况下执行操作*,则应考虑将 Range 对象传递给外部库,假装您实际上是在传递一维数组。在 C# 中接收它,您就可以选择所有很酷的东西,例如 LINQ。