UWP / WinRT APIプロジェクション言語のパフォーマンスの小さな比較

WinRT言語のプロジェクション



私の意見では、UWP / WinRTアプリケーションの開発において異常な状況が発生しています。同社は管理環境からネイティブSDKの使用を促進しています。 このアプローチがどれほど効果的かと思いまして。 そして答えとして、私はUWP / WinRT APIが提供するツールに依存して、同じ問題を解決するいくつかのアプリケーションを作成することにしました。

私の小さなテストの結果については、猫へようこそ。



問題の声明



各アプリケーションの操作アルゴリズムには、次の手順が含まれていました。

  1. 実行可能環境はMain()関数を呼び出します(この関数は常にWinRT / UWPアプリケーションに存在することに驚かないでください)
  2. CoreApplication.Run(...)メソッドには、CreateView()メソッドでIFrameworkViewインターフェイスを返すIFrameworkViewSource実装が渡されます。
  3. いくつかの初期化手順の後、IFrameworkView.Run()メソッドが呼び出されます。これにより、メインアプリケーションウィンドウがアクティブになり、イベントのディスパッチャー処理が開始され、計算を実行するスレッド/タスクが作成されます。


計算の実行に必要な時間をより正確に測定するために、デバッガーなしでアプリケーションが起動されました。 結果と経過時間の値は、それぞれ「結果」アプリケーションと「時間」アプリケーションのローカル設定のフィールドに入力されました。

すべての計算を実行するのに必要な時間を測定するシーケンスは次のとおりです。

  1. 変数の初期化
  2. 開始タイマー/開始時間変数の初期化
  3. 複数の変換:入力-> SHA256ハッシュ-> Base64文字列->入力
  4. タイマーの停止/経過時間の計算
  5. ローカル設定への値の書き込み
格納された値を読み取るために、アプリケーションがデバッグモードで起動され、データがコンソールに表示されました。



合計で5つのテストアプリケーションプロジェクトが作成され、そのうち3つは作業でUWP / WinRT APIを使用し、2つは独自のSHA256およびBase64の実装に依存していました。

アプリケーションの一般的なリスト:

C#で記述されたプロジェクトは、通常の実行に加えて、.NET Nativeを使用したコンパイルモードでもテストされました。



試験結果



テストは、ARMとx86の2つのコンパイルおよび実行モードで実行されました。

以下はランタイムチャートです(値はミリ秒単位です)。



腕



x86



このような大きな違いは私を少し驚かせました。 理解するために、UWP / WinRT APIを使用してアプリケーションのプロファイルを作成することにしました。

すべてのスクリーンショットをテーブルに縮小すると、次のものを取得できます。



このような大きな違いの理由に気付くのは簡単です:WRLを使用して純粋なC ++で記述されたプロジェクトでは、CryptoWinRT.dllライブラリからのコードランタイムは90%に達し、.NET Nativeを使用してコンパイルされたC#プロジェクトでは、この値はわずか15% 。 そのため、ほとんどの場合、C#で作成されたプロジェクトはアイドル状態で動作します。



おわりに



もちろん、現実から離れた場所でUWP / WinRT APIを使用する方法が選択されていることは明らかです。 ほとんどの場合、このようなコードはまったく発生しません。 ただし、状況によっては、言語プロジェクションを使用した結果として発生するオーバーヘッドのために、コードの動作が非常に遅くなることがあります。 この場合の最善の解決策は、システムAPIを使用せずに、同様のタスクを実行する代替実装でしょう。



すべてのプロジェクトのソースコードは、 https://github.com/altk/sha256comparisonで入手できます



All Articles