2009-11-11 13 views
7

、一部の機能はOCamlの(リストから例えば、マップ)で実装するのは本当に簡単ですが、あなたはOCamlのライブラリのマップを使用することがあります。List.mapOCamlのモジュールとパフォーマンス

しかし、我々はどのコードを疑問に思うことができますより効率的になります。別のコンパイル単位(ライブラリ)のモジュールを呼び出すと、いくつかの最適化が無効になることがあります。ニュースグループfa.camlで、ライブラリから関数を呼び出すときにクロージャが使用されることを読んでいます。

私は、ジェネリックプログラミングを行うためにモジュールとFunctorsを使用するOCamlコードを本番環境に用意しています。歴史的な理由から、私のコードは単一のファイルにまとめられています。今私はもっと時間があります、私はコードをそのようなモジュールのためのファイルに分けていきたいと思います。しかし、私はそれを正しくするために私がしばらくかかったので、私はパフォーマンスを失うことができます恐れている。たとえば、複雑なオブジェクトを数値でラップするモジュールがあるので、一意の表現と高速比較を実行します。私はラップされたオブジェクトを一般的なマップ、セット、およびキャッシュを使ってそれらを使用します。

質問は次のとおりです。

  • 私は別のファイルに移動した場合の性能を失うつもりですか?
  • OCamlはモジュール、ファンクタなどでコード全体を最適化していますか?

C++では、クラスメソッドを.hに定義すると、コンパイラが短いメソッドなどをインライン展開することになります。OCamlで分離されたファイルを使用してこれを実現することは可能ですか?

+0

ocamlコンパイラとリンカの内部についてはよくわかりませんので、私はあなたの質問に答えられません。しかし、コードをモジュールに分割してパフォーマンスを失った場合、私は非常に驚いています。あなたが数ミリ秒を失ったとしても、あなたのコードの明瞭さが増していく価値があります。 –

+0

C/C++では大きな違いが生じます。私は数百万のオブジェクトを持っています。アクセスごとの一連の参照は非常に悪いことがあります。 – hectorpal

+0

はい、コンパイラはこれらの参照をインライン展開して、実際に必要以上の参照をしないようにする必要があります。どのようにダミーモジュールの束を使ってテストプロジェクトを作成し、それらを分割して同じファイルに保存するかの違いがあるかどうかを調べてみてください。作業コードベースのリファクタリングよりもはるかに少ない作業かもしれません。うまくいけば、ocamloptがコードをインテリジェントに最適化できるという確信が得られることを願っています。 –

答えて

9

パフォーマンスが低下することがあります。しかし、2つの問題を緩和する要因がある:

  • コードがカップル警告と(たとえ別のコンパイルユニットにわたってインライン化することが可能であるので、OCamlのネイティブコードコンパイラは、クロスモジュールのインライン化を行うことができます - 再帰関数と関数の引数はモジュール[1]にインライン化されません)。
  • コードはまだ十分に高速である可能性が高く、可読性と保守性の向上はパフォーマンス上のコストを大幅に上回る可能性があります。

OCamlは、同じソースファイルでファンクタが定義されているコードをデパンクチャリングするかどうか分かりません。もしそうでなければ、モジュールは、すでにファンクタによって被ったパフォーマンスヒットを上回らないようにするべきです。

一般的には、わかりやすく読みやすくメンテナンス可能なコードを書いて、コードが実際には遅すぎると判明しない限り、このような微視的な性能特性についてあまり心配する必要はありません。

+0

マイケルに感謝します。良い情報。もちろん、わかりやすくわかります。私が今持っているものは満足のいくものではありません。しかし、私の場合、実行時のパフォーマンスは重要な問題です。私はすでにリストから配列への切り替えに多くの時間を費やしています(私は現在、配列を増やすためにResライブラリを使用しています)。また、キャッシュがたくさんあり、慎重にデータ構造を選択しました。私がやったことをやって、10分や最悪から10秒に落ちたと思う。私の懸念は、主に、何百万ものオブジェクトの表現をラップするモジュールに関するものです。私はとにかく分割されますが、私はその影響を徹底させる必要があり、すべてを分割することはできません。 – hectorpal

+0

コードのリファクタリングが完了したら、必要に応じていくつかのモジュールを選択してメインファイルに戻すのは比較的簡単です。 –

関連する問題