Я пишу много надстроек Office на C #, и мне нравятся все замечательные способы расширения функциональности особенно Excel.Но одна вещь, которая продолжает вызывать у меня проблемы, - это непроизводительные издержки, связанные с выполнением практически чего угодно для любого объекта Office.
Я знаю, что существуют высокоуровневые приемы, позволяющие выполнять многие задачи быстрее, например, чтение и запись object[,]
массивы для большего диапазона ячеек вместо доступа к отдельным ячейкам и т. Д.Но, несмотря на это, сложная надстройка всегда будет иметь доступ к множеству различных объектов, ко многим свойствам нескольких объектов или к одним и тем же свойствам снова и снова.
И при профилировании своих надстроек я всегдаЯ считаю, что я трачу не менее 90% своего процессорного времени на доступ к основным свойствам объектов Office.Например, вот немного кода, который я использую, чтобы проверить, прокручивалось ли окно, поэтому я могу соответствующим образом обновить некоторую оверлейную графику:
Excel.Window window = Globals.ThisAddIn.Application.ActiveWindow;
if (window.ScrollColumn != previousScrollColumn)
{
needsRedraw = true;
previousScrollColumn = window.ScrollColumn;
}
if (window.ScrollRow != previousScrollRow)
{
needsRedraw = true;
previousScrollRow = window.ScrollRow;
}
if (window.Zoom != previousZoom)
{
needsRedraw = true;
previousZoom = window.Zoom;
}
Первая строка, получая активное окно и каждый изоператоры if, каждый из которых обращается к свойству этого окна, при профилировании загораются.Они действительно медленные.
Теперь я знаю, что это COM-объекты в управляемых оболочках, и там происходит что-то вроде управляемого -> неуправляемого интерфейса, вероятно, межпроцессное взаимодействие и так далее, так что я неУдивлен, что есть некоторые накладные расходы, но я все еще поражаюсь, как много они складывают.
Так есть ли какие-нибудь приемы для ускорения подобных вещей?
Например, в приведенном выше случае я получаю доступ к трем свойствам одного и того же объекта.Я не могу помочь, но думаю, что должен быть какой-то способ прочитать их все за один раз, как, может быть, с помощью надстройки родного компаньона или еще чего-нибудь ...?
Есть идеи?