среда выполнения Windows компоненты и оптимизация взаимодействия

Сведения о том, как создавать приложения Windows, которые используют компоненты среды выполнения Windows и межпрограммное взаимодействие между собственными и управляемыми типами, и избежать проблем с производительностью в связи с таким взаимодействием.

Рекомендации по обеспечению взаимодействия с компонентами среды выполнения Windows

Невнимательность при разработке приложения может привести к тому, что использование компонентов среды выполнения Windows существенно отразится на его производительности. В этом разделе описано, как добиться высокой производительности приложения, использующего компоненты среды выполнения Windows.

Введение

Взаимодействие может иметь большое влияние на производительность, и вы можете использовать его, даже не осознавая, что вы. Среда выполнения Windows обрабатывает взаимодействие со множеством компонентов, что позволяет повысить производительность и повторно использовать код, написанный на других языках. Мы рекомендуем воспользоваться преимуществами, предлагаемыми компонентами среды выполнения Windows, но при этом помнить, что это может сказаться на производительности. В этом разделе рассматриваются действия, которые можно сделать, чтобы уменьшить влияние взаимодействия на производительность вашего приложения.

Среда выполнения Windows снабжена библиотекой типов, доступ к которой осуществляется с помощью любого языка, который можно использовать для написания приложений универсальной платформы Windows. Типы среды выполнения Windows на языке C# или Microsoft Visual Basic используются так же, как и объекты .NET. Для получения доступа к компонентам среды выполнения Windows нет необходимости использовать методы вызова платформы. Это делает написание приложений гораздо менее сложным, но важно понимать, что может возникнуть больше взаимодействия, чем вы ожидаете. Если компоненты среды выполнения Windows написаны не на языке C# или Visual Basic, то при их использовании границы взаимодействия будут нарушены. Пересечение границ взаимодействия может повлиять на производительность приложения.

При разработке приложения среды выполнения Windows на языке C# или Visual Basic наиболее часто используются два набора API: API среды выполнения Windows и API .NET для приложений UWP. В целом типы, предоставляемые Windows и созданные в среде выполнения Windows, находятся в пространствах имен, начинающихся с "Windows", а типы .NET находятся в пространствах имен, начинающихся с "System". Но, существуют исключения. Типы в .NET для приложений UWP не требуют взаимодействия при их использовании. При снижении производительности в области, которая использует компоненты среды выполнения Windows, можно использовать вместо них API .NET для приложений UWP. Это позволит повысить производительность.

Примечание. Большинство компонентов среды выполнения Windows, которые поставляются с Windows 10, реализованы в C++, поэтому при их использовании из C# или Visual Basic нарушаются границы взаимодействия. Всегда проверяйте приложение, чтобы узнать, влияет использование компонентов среды выполнения Windows на его производительность или нет, прежде чем потратить средства на внесение изменений в код.

Термин "компоненты среды выполнения Windows" в контексте этого раздела означает компоненты среды выполнения Windows, написанные не на C# или Visual Basic.

 

При каждом доступе к свойству или вызове метода в компоненте среды выполнения Windows возникают затраты, связанные со взаимодействием. На самом деле создание компонента среды выполнения Windows более затратно, чем создание объекта .NET. Причина в том, что среда выполнения Windows должна выполнить код, обеспечивающий переход с языка приложения на язык компонента. Кроме того, при передаче данных в компонент необходимо преобразовать данные между управляемыми и неуправляемными типами.

Эффективное использование компонентов среды выполнения Windows

Чтобы добиться высокой производительности, вы должны обеспечить максимально эффективное использование компонентов среды выполнения Windows вашим кодом. В этом разделе даются некоторые рекомендации по повышению производительности при использовании компонентов среды выполнения Windows.

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

Рассмотрите возможность использования для приложений UWP типов, предоставляемых платформой .NET

В ряде случаев задачу можно выполнить, используя для приложений UWP либо тип среды выполнения Windows, либо тип платформы .NET. Использовать вместе типы .NET и типы среды выполнения Windows не рекомендуется. Попробуйте остаться в одном или другом. Например, можно проанализировать поток xml, используя тип Windows.Data.Xml.Dom.XmlDocument (тип среды выполнения Windows) или тип System.Xml.XmlReader (тип .NET). Используйте API, который используется из той же технологии, что и поток. Например, если вы читаете XML из MemoryStream, используйте тип System.Xml.XmlReader, так как оба типа являются типами .NET. При считывании из файла используйте тип Windows.Data.Xml.Dom.XmlDocument, так как API файла и XmlDocument являются собственными компонентами среды выполнения Windows.

Копирование объектов среды выполнения окна в типы .NET

Когда компонент среды выполнения Windows возвращает объект среды выполнения Windows, может быть полезно скопировать возвращенный объект в объект .NET. Это особенно важно при работе с коллекциями и потоками.

При вызове API среды выполнения Windows, возвращающего коллекцию, и последующем многократном сохранении такой коллекции и многократном доступе к ней может оказаться полезным скопировать эту коллекцию в коллекцию .NET, а затем использовать ее версию .NET.

Кэширование результатов вызовов в компоненты среды выполнения Windows для последующего использования

Улучшить производительность можно за счет сохранения значений в виде локальных переменных вместо многократных обращений к типу среды выполнения Windows. Это может быть особенно полезно, если вы используете значение внутри цикла. Измеряйте приложение, чтобы узнать, улучшает ли использование локальных переменных производительность приложения. Использование кэшированных значений может увеличить скорость приложения, так как она будет тратить меньше времени на взаимодействие.

Объединение вызовов к компонентам среды выполнения Windows

Попробуйте выполнить задачи с наименьшим количеством вызовов объектов UWP как можно скорее. Например, обычно лучше считывать большое количество данных из потока, чем читать небольшие объемы за раз.

Используйте API, которые работают в пакете как можно меньше вызовов, а не API, которые выполняют меньше работы и требуют больше вызовов. Например, предпочтительнее создавать объект путем вызова конструкторов, которые один раз инициализируют множественные свойства, а не путем вызова конструктора по умолчанию и назначения свойств по одному.

Создание компонентов среды выполнения Windows

При написании компонента среды выполнения Windows, который могут использовать приложения на языке C++ или JavaScript, убедитесь в том, что такой компонент обеспечивает хорошую производительность. Все предложения по получению хорошей производительности в приложениях применяются к получению хорошей производительности в компонентах. Определите, какие API имеют шаблоны трафика и для этих областей, рассмотрите возможность предоставления API, позволяющих пользователям работать с несколькими вызовами.

Быстрое использование приложения при использовании взаимодействия в управляемом коде

Компоненты среды выполнения Windows упрощают взаимодействие между собственным и управляемым кодом, но если не проявить осторожность, они могут привести к издержкам производительности. Здесь мы покажем, как получить хорошую производительность при использовании взаимодействия в управляемых приложениях UWP.

Компоненты среды выполнения Windows позволяют разработчикам создавать приложения, использующие XAML, на многих языках, так как версии API среды выполнения Windows доступны на всех языках. При создании приложения на C# или Visual Basic это удобство сказывается на межпрограммном взаимодействии, так как API среды выполнения Windows обычно реализованы в машинном коде, а любой вызов среды выполнения Windows из C# или Visual Basic требует перехода среды CLR от управляемого к машинному кадру стека и от параметров функции маршалинга к представлениям, доступным для машинного кода. Эти затраты не являются незначительными для большинства приложений. Но если используется большое число вызовов (от сотен тысяч до миллионов) API среды выполнения Windows в критическом пути приложения, эти издержки становятся заметными. Как правило, необходимо убедиться, что время, затраченное на переход между языками, невелико относительно выполнения остального кода. Это показано на следующей схеме.

Interop transitions should not dominate the program execution time.

Типы, перечисленные в .NET для приложений Windows, не несут этой стоимости взаимодействия при использовании из C# или Visual Basic. Как правило, можно предположить, что типы в пространствах имен начинаются с "Windows". являются элементами набора API среды выполнения Windows, предоставляемых системой Windows, а типы в пространствах имен, которые начинаются со слова "System.", — это типы .NET. Следует учитывать, что даже простое использование типов среды выполнения Windows, например выделение или доступ к свойству, влечет за собой издержки взаимодействия.

Необходимо измерить приложение и определить, занимает ли взаимодействие большую часть времени выполнения приложений, прежде чем оптимизировать затраты на взаимодействие. Анализируя производительность своего приложения при помощи Visual Studio, вы можете легко определить верхнюю границу издержек межпрограммного взаимодействия, используя представление Функции и проверив инклюзивное время, затрачиваемое на методы, которые вызываются в среды выполнения Windows.

Если приложение работает медленно из-за издержек взаимодействия, можно повысить производительность за счет снижения количества вызовов API среды выполнения Windows в активно используемых ветвях кода. Например, игровой механизм, выполняющий тонны физических вычислений, постоянно запрашивая позицию и измерения UIElements , может сэкономить много времени, сохраняя необходимые сведения из UIElements в локальные переменные, выполняя вычисления по этим кэшируемым значениям, и присваивая конечный результат обратно в UIElements после выполнения вычислений. Другой пример: если коллекция сильно обращается к коду C# или Visual Basic, то более эффективно использовать коллекцию из пространства имен System.Collections, а не коллекцию из пространства имен Windows.Foundation.Collections. Можно также попробовать скомбинировать вызовы компонентов среды выполнения Windows — например, при помощи API Windows.Storage.BulkAccess.

Создание компонента UWP

При написании компонента среды выполнения Windows для использования в приложениях на языках C++ или JavaScript убедитесь в том, что такой компонент обеспечивает хорошую производительность. Область API определяет границу взаимодействия и определяет степень, в которой пользователи должны думать о руководстве в этом разделе. Если вы распределяете компоненты другим сторонам, это становится особенно важным.

Все предложения по получению хорошей производительности в приложениях применяются к получению хорошей производительности в компонентах. Измеряйте компонент, чтобы узнать, какие API имеют шаблоны трафика с высоким уровнем трафика, и для этих областей рекомендуется предоставлять API, которые позволяют пользователям работать с несколькими вызовами. Разработчики среды выполнения Windows приложили немало усилий, чтобы приложения могли использовать ее без необходимости в частом нарушении границы межпрограммного взаимодействия.