Проблема производительности объекта VSTO Excel - PullRequest
0 голосов
/ 09 мая 2011

Привет, я написал этот небольшой пример AddIn, чтобы показать вам проблему с производительностью и как ее избежать

Может кто-нибудь объяснить мне, почему и как это работает?

Это просто анализКнига Excel и выполняется в основном процессе Excel (0) и случайный поток, созданный таймером.

Спасибо!

Public Class ThisAddIn

Dim a As System.Windows.Threading.Dispatcher = System.Windows.Threading.Dispatcher.CurrentDispatcher()
Dim t As New Threading.Thread(New Threading.ParameterizedThreadStart(AddressOf threadTest))
Dim tm As New System.Timers.Timer(20000)
Delegate Sub TestHandler()
Dim tt As TestHandler = AddressOf test

Private Sub ThisAddIn_Startup() Handles Me.Startup
    tm.AutoReset = True
    tm.Start()
    AddHandler tm.Elapsed, AddressOf threadTest
End Sub

Private Sub ThisAddIn_Shutdown() Handles Me.Shutdown

End Sub

Public Sub test()
    Dim appE As Excel.Application = Globals.ThisAddIn.Application
    Dim wb As Excel.Workbook = appE.ActiveWorkbook
    Dim ws As Excel.Worksheet = wb.ActiveSheet
    Dim rng As Excel.Range = ws.Cells(1, 1)

    Dim nbit As Integer = 10000
    For i = 1 To nbit
        rng.Value = i
    Next
End Sub

Private Sub threadTest()
    ' 800 ms
    Dim o() As Object
    a.Invoke(tt, o)

    '12 seconds !
    test()

End Sub
End Class

1 Ответ

1 голос
/ 09 мая 2011

Вы погружаетесь в мир моделей потоков COM.Это хорошее начало, как и любое другое: http://msdn.microsoft.com/en-us/library/ms693344(VS.85).aspx.

Если код выполняется в главном потоке Excel (что достигается путем настройки Dispatcher), вызовы COM не маршалируются в разных потоках.Поскольку у вас много COM-вызовов (каждый .Value считается за один), накладные расходы складываются с теми различиями, которые вы видите.

Одна из причин, по которой маршалинг в этом контексте дорогостоящий, заключается в том, что COM-объекты Excel работают в однопоточном хранилище (STA), что означает, что установлен цикл обработки сообщений (фактически Windows).цикл сообщений) в Excel для сериализации вызовов COM.Каждый вызов между квартирами, который вы делаете, приводит к тому, что сообщение отправляется в этот цикл сообщений, который обрабатывается в главном потоке Excel.

Таким образом, эти два случая отличаются по производительности из-за маршалинга COM между квартирами.Это на самом деле удивительно быстро, учитывая то, что происходит за кулисами.

В обоих случаях выполнение одного вызова для установки большого значения .Value для массива значений будет намного быстрее.А для самого быстрого (миллион ячеек в секунду) способа ввода данных в таблицу Excel см. Здесь: Самый быстрый способ взаимодействия между живыми (несохраненными) данными Excel и объектами C # .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...