Я экспортирую этот метод C# через COM:
public interface IMatrixMath {
void AddScaledRange3D(ref double[,,] acc, [In] ref double[,,] vals, double scale);
// ...
}
Затем я вызываю его с большими матрицами из VBA в Excel:
Dim A(0 To 2000, 0 To 120, 0 To 500) As Double
Dim B(0 To 2000, 0 To 120, 0 To 500) As Double
' ...
MatrixMath.AddScaledRange3D A, B, 0.4
Это занимает около 15 секунд. но только 1 секунда этого времени уходит на C#. Большинство из них - это издержки до того, как войдет в метод C#.
Я не уверен, откуда взялись накладные расходы. Если Excel нужно выполнить маршалинг в SAFEARRAY, не нужно ли ему также выполнить маршалинг в ответ? Почему это занимает так много времени, разве Excel не хранит массивы непрерывно? Может ли это быть связано с пересечением определенных границ COM?
Есть ли способы обойти эти накладные расходы? Я не против иметь дело с необработанными указателями или без COM-взаимодействия.