私は現在、マルチスレッドの高効率でスケーラブルなアルゴリズムを書いています。コードのパラメーターを推測する必要があり、特定のデータ セットで計算がどのように実行されるかがわからないため、変数を監視したいと考えています。このテストは、実世界の膨大なデータ セットでのみ機能します。プロファイリング後に収集したデータを分析することが可能です。次の単純なコード例を想像してみてください (実際のコードには複数のウォッチ ポイントが含まれる場合があります。
// function get's called by loops of multiple threads
void payload(data_t* data, double threshold) {
double value = calc(data);
// here I want to watch the value
if (value < threshold) {
doSomething(data);
} else {
doSomethingElse(data);
}
}
私は次のアプローチについて考えました:
cout
または他のシステム出力を使用する- バイナリ出力 (ファイル、ネットワーク) を使用する
- gdb/lldb でブレークポイントを設定する
- 変数の監視と gdb/lldb 経由のロギングを使用する
1. と 2. を使用するには、コードを変更する必要がありますが、これはデバッグ/評価タスクです。さらに、1. はロックが必要で、1.+2. I/O 操作が必要なため、コード全体が大幅に遅くなり、実際のデータを使用したテストがほぼ不可能になります。3.も遅すぎる。4. を使用するには、グローバル変数ではないため変数アドレスを知る必要がありますが、動的スケジューラによってスレッドが作成されるため、スレッドごとにブレーク + ステップが必要になります。
したがって、私の結論は、マシン コード レベルで動作し、double->string 変換なしで変数をダンプ/ログ/監視し、非常に効率的なプロファイラー/デバッガーが必要である、または他の言葉で要約すると、次のようになります。大幅なスローダウンや大幅な変更を行わずに、アルゴリズムの内部状態。これができるツールを知っている人はいますか?