QCoreApplicationの低速テスト

信頼性とセキュリティのために、大規模でモノリシックなアプリケーションをサポートするのではなく、アプリケーションの機能を多くの小さな実行可能ファイル(デーモン)に分割するのが理にかなっています。



かつて、Qt4はいくつかのモジュールに分割され、特にグラフィカルインターフェイスを必要としないアプリケーションの作成が可能になりました。 組み込みアーキテクチャといくつかの賢明なアーキテクチャソリューションに重点を置いて、Qt5はこのアプローチを新しいレベルに引き上げました。



簡単な関数を見てみましょう:

QCoreApplication app(argc, argv); QTimer::singleShot(3000, &app, SLOT(quit())); return app.exec();
      
      





これは、グラフィカルインターフェイスを持たないQtアプリケーションです。 3秒間実行されてから終了します。



標準カーネルとQt 4.8.1を搭載したKubuntu 12.04では、Valgrindは102 kbのヒープのピーク使用を示していますが、Callgrindは1.9(*)百万のプロセッサー命令が実行されたと報告しています。



Qt 5の今日のビルドで受け取った数値を見てみましょう。Valgrindはヒープ上のメモリ割り当て4.9 KBを報告し、Callgrindは114,000プロセッサ命令について報告します。



つまり、Qt 5は、QCoreApplicationコンストラクターおよびイベントループの実行に使用するメモリが約20倍、プロセッサ命令が約16倍少なくなります。



これにはいくつかの理由があります。 特に、Qt 5では、すべての文字列がデフォルトでUnicodeエンコードされていると想定しているため、テキストエンコーディングコンバーターの初期化は、最初の非Unicode文字列が表示されたときにのみ行われます。 プラグインのダウンロードパフォーマンスはQt 5で大幅に改善されましたが、さらに高速にロードできません。



その他の改善も速度に影響しました。たとえば、Qt5でのC ++ 11サポートの導入により、ヒープ上のメモリ割り当てを必要としないUnicode文字列を作成できるようになりました。



一般的に、Qtで悪魔を書くことを楽しんでみてください。コードを最適化するためのアイデアがあれば、 Qt Codereviewにようこそ



(*)警告:命令の数はコードの速さではなく、プロセッサによって実際に処理された命令の数のみを示します。 すべての場合で、共有ライブラリのロードのオーバーヘッドに注意を払わずに、メイン()関数のパフォーマンスのみを測定したことに注意してください。したがって、アプリケーションは、事前リンクまたは既に実行中のプロセスからの直接分岐によってさらに最適化できます。



翻訳者から:このような小さな翻訳が定着し、私が翻訳者としての完全な嫌がらせではない場合、Qt Labsブログからのメモの翻訳を続けようとします。 ありがとう=)



All Articles