Невелике порівняння продуктивності UWP/WinRT API мовних проекцій

WinRT Language projections

На мій погляд, у розробці UWP/WinRT додатків склалася незвичайна ситуація: компанія просуває використання нативного SDK з керованою середовища. Мені стало цікаво, наскільки ефективний цей підхід. І для відповіді, я вирішив написати кілька програм, що вирішують одну і тугіше завдання, покладаючись на кошти надаються UWP/WinRT API.
За результатами мого невеликого тесту добра просимо під кат.

Постановка завдання

Алгоритм роботи кожного додатка включав в себе наступні кроки:
  1. Виконуваної середовищем викликається функція Main()(не дивуйтеся, додатки WinRT/UWP ця функція завжди існує)
  2. Методом CoreApplication.Run(...) передається реалізація IFrameworkViewSource, яка повертає в методі CreateView() інтерфейс IFrameworkView
  3. За кілька кроків ініціалізації викликається метод IFrameworkView.Run(), який виконує активацію основного вікна програми, запускає обробку подій диспетчером і створює потік/завдання для виконання обчислень
Щоб точніше виміряти необхідний час на виконання обчислень, програми запускалися без відладчика. Значення результату і витраченого часу заносилися в поля локальних налаштувань програми «Result» і «Time» відповідно.
Послідовність виміру часу, необхідного на виконання всіх обчислень, зводилася до наступного:
  1. Ініціалізація змінних
  2. Запуск таймера/ініціалізація змінної часу початку
  3. Багаторазове перетворення: вхідні дані -> SHA256 хеш -> Base64 рядок -> вхідні дані
  4. Зупинка таймера/обчислення пройденого часу
  5. Запис значень локальні налаштування
Для читання збережених значень програми запускалися в режимі налагодження, а дані виводилися в консоль.

Всього було створено п'ять тестових проектів програм, три з яких використовували в своїй роботі UWP/WinRT API, а два інших покладалися на власну реалізацію SHA256 і Base64.
Загальний список додатків:
  • CPP (C++). Сишные реалізації алгоритмів були взяті з github.com/B-Con/crypto-algorithms.
  • CPPCX (C++ CX). Використовує API CryptographicBuffer, що надається UWP/WinRT.
  • CPPWRL(C++). Також використовує API CryptographicBuffer, але виклики здійснюються в манері COM.
  • CS(C#). Взята реалізації з github.com/yuriks/SHA2-Csharp/blob/master/Sha256.cs.
  • CSWinRT(C#). Використовується API CryptographicBuffer.
Проекти, написані на C#, крім звичайного виконання, тестувалися також в режимі компіляції з використанням .NET Native.

Результати тестування

Тестування проводилося в двох режимах компіляції і виконання: ARM і x86.
Нижче представлені діаграми часу виконання(значення вказані у мілісекундах).

ARM

x86

Настільки значна різниця мене трохи здивувала. Щоб розібратися я вирішив провести профілювання додатків, що використовують UWP/WinRT API.
Якщо звести всі скріншоти в таблицю, можна отримати наступне:
Легко помітити причину настільки великої різниці: в проекті, написаному на чистому C++ з використанням WRL, час роботи коду з бібліотеки CryptoWinRT.dll, досягає значення 90 відсотків, а в проекті C#, скомпільованому з використанням .NET Native, це значення дорівнює 15 відсоткам. Ось і виходить, що більшу частину часу проекти, написані на C#, працюють вхолосту.

Висновок

Звичайно, зрозуміло, що обраний віддалений від реальності метод використання UWP/WinRT API. Швидше за все в житті такий код взагалі ніколи не зустрінеться. Але факт залишається фактом, при певному збігу обставин, ваш код може працювати дуже повільно тільки через накладних витрат, що виникли в результаті використання мовної проекції. Може бути найкращим рішенням в цьому випадку буде альтернативна реалізація, яка виконує аналогічні завдання, але без використання системного API.

Вихідний всіх проектів код доступний за адресою https://github.com/altk/sha256comparison

Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.