Как избежать дорогостоящей сортировки массива между VBA и C#? - PullRequest
2 голосов
/ 05 марта 2020

Я экспортирую этот метод 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-взаимодействия.

...