2

PyPy でコードをプロファイリングするためにstatprof.pyを使用したいと思います。残念ながら、動作していないようです。それが指す行番号がずれています。誰かがそれを機能させる方法を知っているか、代替案を知っていますか?

4

1 に答える 1

5

JITted コードの PyPy は多くの関数をインライン化し、ループの最後にシグナル (ここではタイマーから) のみを配信するため、「行番号がずれている」可能性があります。これを CPython と比較してください。CPython は、2 つのランダムなバイトコード間でシグナルを配信します。ループの最後にある場合もありますが、通常はどこでも配信されます。したがって、PyPy で得られるものは、シグナル ハンドラを「ループの終わり」バイトコードでのみ実行するように制約した場合に CPython で得られるものと同じです。

これが、ループのないほとんどの関数と同様に、この種のプロファイリングが常に多くの関数を見落としているように見える理由です。

組み込みの cProfile モジュールの使用を試すことができます。もちろん、統計プロファイリングよりも大きなパフォーマンス ヒットが伴いますが、とにかく試してみてください。たとえば、JITting を妨げないため、パフォーマンス ヒットは妥当なはずです。

より一般的に言えば、PyPy で統計プロファイリングに相当するものを実装する簡単な方法がわかりません。互いにインライン化され、グローバルに最適化された関数が存在する場合、それを理解するのは非常に困難です...他の高級言語用に、統計を行うツールが実際に存在することを見つけていただければ幸いです。トレース JIT を使用した VM でのプロファイリング。

十分な情報を記録して、アセンブラー命令の各小さなグループを元の実際の Python 関数まで追跡し、ハックを使用して現在の命令ポインター (IP) をマシン レベルで調べることができます。不可能ではありませんが、真剣な作業です:-)

于 2013-06-27T16:49:22.323 に答える