2016-04-03 7 views
5

私のdコードのどの部分をコンパイルするのに時間がかかるのですか?Dコンパイラのプロファイリング

私はvalgrindを使用しようとしましたが、メソッド名はそれほど洞察力がありませんでした。時間の87%は<cycle 7>に費やされた時間の40%が_D4ddmd5lexer5Lexer4scanMFPS4ddmd6tokens5TokenZv

に私はこのような何かを探しています:時間の40%はxy.dに費やされた、その外の時間の80%は、さまざまなコンパイルましたテンプレートxyzのインスタンシエーションとその理由は、それがmemcpy時間の99%を使用したためです。

私はDMDとLDCの両方をプロファイリングすることに興味があります。

+1

Dコンパイラはどの言語ですか? GDBの下でDコンパイラのデバッグ版を実行できますか?可能であれば、それを一時停止し、コンパイラのデータ構造を調べ、それが何を処理しているかを確認してください。これを数回行います。それが最も働いているのは明らかです。正確な測定のようなものは必要ありません。 –

+0

GDBに接続する方法と、コンパイラのデバッグ版を入手する方法はわかりませんが、試してみます。 – Tamas

答えて

1

DコンパイラのフロントエンドはDで書かれているので、従来のツールを使ったプロファイリングはC++のようなものに比べてやや難しいでしょう。 Linuxでgdbやvalgrind、WindowsでVisualDのようなツールを使っていくつかの成功を収めました.MacユーザーはSOLの一種です。

あなたは他の5つのオプションがあります。コンパイラで特定の機能を発見し、問題についての共通知識に頼るしようとして

  1. ストップ(下記参照)
  2. https://github.com/CyberShadow/DBuildStatのようなツールを使用します。それはあなたに求めている正確な答えを与えるものではありませんが、大きなプロジェクトをコンパイルしようとすると、より速くコンパイルできます。
  3. -vフラグを使用して、プログラムのどの部分がしばらく時間がかかるかを確認します。確かに、これは非常に強力なアプローチであり、しばらく時間がかかります。
  4. -profileスイッチを使用するように、メイクファイルをDMDフロントエンドに変更します。 DMDを実行するたびに、多くの情報を含むプロファイルファイルが取得されます。確かに、これは今まで試みられたとは思わない。あなたの人数は変わるかもしれません。
  5. Githubの問題ページでLDCチームに問い合わせてみてください。 IIRCはWeka.ioコードベースで使用したプロファイリングのためのパッチ版を作成しました。

私はよく知っていると言いますが、私はあなたの遅い編集はおそらくいくつかの一般的な問題によるものだと言います。たとえば、SQLクエリが長時間かかる場合、私の最初の反応はMySQLサーバコードをプロファイルしようとすることではありません。ここでは、それはあなたのランタイムをスピードアップしながら、遅いで、最も一般的な問題

  1. CTFEのカップルです。特にallSatisfyのような再帰的なテンプレートや、ctRegexのようなあなたの関数を使用している場合。重いCTFEを実行していて、より遅いコードの代償でコンパイルを高速にするには、ランタイムコールに切り替えることを検討してください。
  2. DMDはプログラムで使用されていないシンボルを無視しません。つまり、モジュールをインポートすると、モジュール内のすべての関数に対してcode-genが実行されます。これは、選択的インポートであっても当てはまります。それらを使用しないと、リンカは結果の実行可能ファイルから関数を削除しますが、コンパイラはコンパイルに時間がかかりました。 import std.algorithm;import std.range;などのインポートは避けてください。代わりにimport std.algorithm.iteration : map;のようなパッケージ固有のインポートを使用してください。