問題タブ [aqtime]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
performance - AQTime はどのようにそれを行いますか?
私は、パフォーマンスとメモリのプロファイラである AQTimeをテストして、Delphi アプリケーションのために多額の費用を費やす価値があるかどうかを確認してきました。
私が驚いたのは、アプリケーションのソース コードを変更したり、パフォーマンスに過度の時間を追加したりすることなく、ソース行レベルのパフォーマンス トレース (各行が実行された回数と行にかかった時間を含む) を提供できることです。デバッグ実行。
彼らがこれを非常に効率的に行う方法は、私が知らないいくつかのテクニック/テクノロジーがここで使用されているのではないかと思います。
コードを変更せずに行ごとに実行をキャプチャするために、彼らがどのような方法を使用しているか知っていますか?
非侵襲的な行ごとのチェックも行う他のプロファイリングツールはありますか?もしそうなら、それらは同じ手法を使用しますか?
iis - AQTime を使用した従来の ASP アプリケーションのプロファイリング
ASP (jscript フレーバー) を使用して多数の Web サイトを開発し、COM を介して基礎となるインテリジェンス レイヤー (Delphi で記述) と通信します。これらの Web サイトは IIS (5 および 6) で実行されています。
何年にもわたって、この ASP レイヤーは非常に重いもの (ビジネス ロジックはありませんが、多くのコントローラー/シナリオ/ビュー/ajax/etc の処理) に成長しており、パフォーマンスを少し調整したいと考えています。作成者によると、AQTime (最新バージョンがあります) をこの目的に使用できます (サーバーサイド スクリプトと基礎となる com オブジェクトの両方を一度にプロファイリングします) が、それを機能させる方法がわかりません。
ヘルプ ファイルには、COM dll、ISAPI dll、さらにはクライアント側スクリプトのプロファイリング方法が説明されていますが、ASP ページで実行されるサーバー側スクリプトのプロファイリング方法については説明されていません。.asp ファイルを「プロファイリング モジュール」として選択できません。Googleも役に立ちません。
これを達成する方法についてアドバイスはありますか?従来の ASP ページをプロファイリングするための別の提案も歓迎します。
comparison - AQTime 4では、異なるディレクトリにインストールされたビルドからのパフォーマンス結果をどのように比較できますか?
たとえば、プロファイルを作成する場合:
次に、両方の結果セットを1つのAQTimeプロジェクトにインポートして比較しようとすると、AQTimeはそれぞれの対応する関数のいずれとも一致しません。比較しているときに、同じ名前でモジュール名が異なる2つの関数に出くわした場合、それらは同じ関数ではないと結論付けて、出力テーブルの別々の行に配置していると思います。モジュール名を無視するにはどうすればよいですか?
delphi - Delphi 用の高速な GetToken ルーチンはありますか?
私のプログラムでは、「|」などの特殊文字を含む何百万もの文字列を処理しています。各文字列内でトークンを分離します。n番目のトークンを返す関数があり、これは次のとおりです。
この関数は、Delphi 4 を使用していたときに開発しました。この関数は、もともと Fastcode によって開発され、現在 Delphi の StrUtils ライブラリに含まれている非常に効率的な PosEx ルーチンを呼び出します。
最近 Delphi 2009 にアップグレードしましたが、文字列はすべて Unicode です。この GetTok 関数は引き続き機能し、問題なく機能します。
私は Delphi 2009 の新しいライブラリを調べましたが、多くの新しい機能と追加機能があります。
しかし、さまざまな fastcode プロジェクトで、新しい Delphi ライブラリのいずれかで必要な GetToken 関数を見たことがありません。また、 Zarko Gajic の Delphi Split / Tokenizer Functions以外の Google 検索では何も見つかりません。私がすでに持っているものと同じくらい最適化されています。
私のプログラムでは、10%でも改善が見られます。代替手段は StringLists であり、常にトークンを別々に保つことは知っていますが、これにはメモリに関して大きなオーバーヘッドがあり、変換するためにすべての作業を行ったかどうかはわかりません。
うわー。この長々とした話の後で、私の質問は次のとおりです。
GetToken ルーチンの非常に高速な実装を知っていますか? アセンブラに最適化されたバージョンが理想的でしょうか?
そうでない場合、上記の私のコードに改善をもたらす可能性のある最適化はありますか?
フォローアップ: Barry Kelly は、私が 1 年前にファイル内の行の解析を最適化することについて尋ねた質問に言及しました。その時、私は自分の GetTok ルーチンが読み取りや解析に使用されていないことさえ考えていませんでした。GetTok ルーチンのオーバーヘッドを見て、この質問をするようになったのは今だけです。Carl Smotricz と Barry の回答があるまで、私はこの 2 つを結びつけることを考えたことはありませんでした。とても明白ですが、登録されませんでした。ご指摘ありがとうございます。
はい、私の Delim は 1 人のキャラクターなので、大幅な最適化を行うことができます。GetTok ルーチン (上記) で Pos と PosEx を使用すると、次のようなコードを使用して、代わりに文字ごとの検索を使用して高速化できるという考えに目がくらみました。
みんなの回答を見て、さまざまな提案を試して比較します。それでは結果を掲載します。
混乱:わかりました、今、私は本当に困惑しています.
Carl と Barry の推奨に従って PChars を使用しました。これが私の実装です。
紙の上では、これ以上のことはできないと思います。
そこで、両方のルーチンをタスクに配置し、AQTime を使用して何が起こっているかを確認しました。私が行った実行には、GetTok への 1,108,514 回の呼び出しが含まれていました。
AQTime は元のルーチンの時間を 0.40 秒に設定しました。Pos への 100 万回の呼び出しには 0.10 秒かかりました。50 万の TokenNum = 1 コピーに 0.10 秒かかりました。600,000 回の PosEx 呼び出しにかかった時間は、わずか 0.03 秒でした。
次に、同じ実行とまったく同じ呼び出しについて、AQTime を使用して新しいルーチンの時間を計りました。AQTime によると、私の新しい「高速」ルーチンは 3.65 秒かかり、これは 9 倍の長さです。AQTime によると、犯人は最初のループでした。
1800 万回実行された while 行は、2.66 秒で報告されました。1600 万回実行された inc ラインは、0.47 秒かかると言われています。
ここで何が起きているのか、今なら分かると思った。昨年提出した質問で、AQTime で同様の問題が発生しました。なぜ CharInSet は Case ステートメントよりも高速ですか?
ここでも Barry Kelly が私にヒントを与えてくれました。これらの数値で明確に示されている結果を圧倒する可能性のある各行にオーバーヘッドが追加されます。新しい「最適化されたコード」で実行された 3,400 万行は、元のコードの数百万行を圧倒し、Pos および PosEx ルーチンによるオーバーヘッドは明らかにほとんどまたはまったくありません。
Barry は、QueryPerformanceCounter を使用して、彼が正しいことを確認するコードのサンプルをくれました。
さて、今度は QueryPerformanceCounter で同じことを行い、私の新しいルーチンが高速であり、AQTime が言うように 9 倍遅くないことを証明しましょう。だからここに行く:
したがって、これは GetTok への 1,000,000 回の呼び出しをテストします。
Pos および PosEx 呼び出しを使用した私の古い手順では、0.29 秒かかりました。PChars を使用した新しいものは 2.07 秒かかりました。
今、私は完全に混乱しています!PChar プロシージャが遅いだけでなく、8 ~ 9 倍も遅い理由を誰か教えてください。
謎解き!Andreas は、Delim パラメータを文字列から Char に変更するように彼の回答で述べました。私は常に Char だけを使用するので、少なくとも私の実装ではこれは非常に可能です。何が起こったのか私は驚いた。
100 万回の呼び出しにかかる時間は、1.88 秒から 0.22 秒に短縮されました。
そして驚いたことに、元の Pos/PosEx ルーチンの時間は、Delim パラメータを Char に変更すると、0.29 秒から 0.44 秒に短縮されました。
率直に言って、Delphi のオプティマイザにはがっかりしています。その Delim は定数パラメーターです。オプティマイザーは、同じ変換がループ内で発生していることに気付き、それを移動して、一度だけ実行されるようにする必要があります。
コード生成パラメーターを再確認します。はい、最適化はTrueで文字列形式はオフにチェックしています。
要するに、Andrea の修正を加えた新しい PChar ルーチンは、私のオリジナルよりも約 25% 高速です (.22 対 .29)。
ここで他のコメントをフォローアップして、テストしたいと思います。
最適化をオフにして文字列形式のチェックをオンにすると、時間が 0.22 から 0.30 に増加するだけです。オリジナルにほぼ同じものを追加します。
アセンブラ コードを使用すること、または Pos や PosEx などのアセンブラで記述されたルーチンを呼び出すことの利点は、設定したコード生成オプションの影響を受けないことです。それらは常に同じ方法で実行され、事前に最適化され、肥大化することはありません。
ここ数日、マイクロ最適化のコードを比較する最良の方法は、CPU ウィンドウでアセンブラー コードを見て比較することだと再確認しました。Embarcadero がそのウィンドウをもう少し使いやすくして、クリップボードに部分的にコピーしたり、その一部を印刷したりできるようにしてくれたらいいのにと思います。
また、この投稿の前半で AQTime を不当に非難しました。新しいルーチンに余分な時間が追加されたのは、AQTime によって追加されたインストルメンテーションが原因だと考えていました。戻って String の代わりに Char パラメーターを使用して確認したところ、while ループは (2.66 から) 0.30 秒に短縮され、inc ラインは (0.47 から) 0.14 秒に短縮されました。インクラインも下がるのは奇妙です。しかし、私はすでにこのすべてのテストに疲れています。
文字単位でループするという Carl のアイデアを取り入れて、そのコードをそのアイデアで書き直しました。.22 秒から .19 秒に短縮されました。したがって、これまでで最高のものがここにあります:
これには、CurToken = Tokennum の比較など、いくつかの小さな最適化がまだある可能性があります。これは、Integer または Byte のいずれか高速な方である必要があります。
しかし、私は今幸せだとしましょう。
StackOverflow Delphi コミュニティに改めて感謝します。
delphi - Delphi で VTune を検討する価値はありますか?
プロファイリング ツールに関するすべての質問を調べていると、聞いたことのないIntel の VTuneを発見して驚きました。700 ドルで、 AQTimeよりもさらに高価です。
しかし、AQTime に大金を投じる決定を下す前に、VTune for Delphi を使用した人はいますか?もしそうなら、AQTime やDelphi 用の他のプロファイリング ツールよりも優れた選択肢となる利点があると思いますか?そこにいますか?
delphi - FinalBuilder と AQTime を使用して DUnit テスト カバレッジ統計を取得する
大規模な Delphi プロジェクト (150 万行のコード) があり、アジャイル プロセスの使用に移行しています。
継続的インテグレーション環境 (FinalBuilder) は既にありますが、これを更新して、開発チームの全員に電子メールで単体テスト (dUnit) とコード メトリック (CodeHealer) を含めました。私たちの単体テストのカバレッジはあまりよくないので、すべてのビルドでテスト カバレッジの結果を得るために、AQtime をミックスに入れようとしています。
「プログラムの実行」タスクを使用して単体テストの実行可能ファイルを実行し、結果をログに記録し、その後ファイルを解析しています。「スクリプトの実行」タスクを使用して (COM 経由で) AQtime を実行し、結果を XML にエクスポートして、それらの結果を解析できるようにします。
私が抱えている問題は、単体テスト実行可能ファイルを実行している AQtime にあり、単体テスト実行可能ファイルを直接監視する機能を失います。FinalBuilder に両方のタスクの結果を解析させたいと思います。AQtime から呼び出されたときに dUnit の結果にアクセスする方法を知っている人はいますか?
performance - プロファイリングがオンになっていない場合でも AQTime の実行が遅くなるのはなぜですか?
AQTime for Delphi では、領域やトリガーなどを使用して問題のある場所に到達するのが非常に高速であることを誇っています。プロファイリングがオンになっていない場合でも。
たとえば、プログラム フローの後半で特定のルーチンをプロファイリングしたいが、そこで何が呼び出されているかがわからない場合、このルーチンをトリガーとしてのみ配置し、スレッドの初期ステータスをオフにしてから、 「ルーチン/ラインによるフルチェック」を選択します。ただし、これを行うと、トリガールーチンがヒットする前に、プログラムの実行が大幅に遅くなります。
たとえば、「準備フロー」が AQTime なしで約 5 分かかる場合、プロファイリングを無効にして実行すると、すでに 30 分間実行されており、トリガーがまだ到達していないことがわかっている場合でも実行されます。
プロファイリングするルーチン/行の量を減らすことでこれを回避できることはわかっていますが、実際のトリガー ルーチンに到達したらすべてをプロファイリングしたいので、これはあまり良い解決策ではありません。
また、別のより良い回避策として、AQTime を使用せずにアプリケーションを起動し、「準備フロー」が完了した後に [Attach to Process] を使用することもできますが、これは GUI で実行が適切な場所で一時停止するか、適切な時間枠を提供する場合にのみうまく機能します。付けをするためです。すべての場合において、これは当てはまりません。
なぜこれがそうであるかについてのコメントはありますか?また、その領域からコードを削減するか、後でプロセスに追加する以外に何かすることはありますか?
c++ - aqtimeを使用した単体テストのコードカバレッジの測定
aqtimeを使用して単体テストのコードカバレッジを測定したいと思います。テストするアプリケーションは、多くのブースト機能を使用します。これで、これらのブーストメソッドがテストレポートに表示されます。レポートのこれらのメソッドでは、ブーストをテストせず、ブーストを使用するクラスをテストしたため、解釈することはほぼ不可能です。
コードカバレッジからブーストを除外するための迅速な方法はありますか?
performance - マルチコアプロセッサを搭載したWindowsVista/7でAQtimeが正しく機能しない
マルチコアラップトップのWindowsVistaまたは7でパフォーマンスプロファイラーとしてAQtime(v5.45)を実行しようとしていますが、プログラムが正しく機能していないようです。ルーチンが表示されず、例外がスローされるようです。 clr.dllでInstallCustomModuleを呼び出そうとすると、vistaと7の両方で完全に動作するAQtime7のデモバージョンをインストールしようとしました。v5.45をから動作させる方法についての回答を得ようとしています。 AQtimeチームのサポートですが、まだ答えがありません...
誰かが同じ問題を抱えているのか、誰かが何らかの方法でそれを修正したのか疑問に思いましたか?または、新しいv7ライセンスを取得することが唯一の方法である場合はどうでしょうか。
前もって感謝します ;)
ビスタマシンの例外に関する詳細は次のとおりです。