、一部の機能はOCamlの(リストから例えば、マップ)で実装するのは本当に簡単ですが、あなたはOCamlのライブラリのマップを使用することがあります。List.mapOCamlのモジュールとパフォーマンス
しかし、我々はどのコードを疑問に思うことができますより効率的になります。別のコンパイル単位(ライブラリ)のモジュールを呼び出すと、いくつかの最適化が無効になることがあります。ニュースグループfa.camlで、ライブラリから関数を呼び出すときにクロージャが使用されることを読んでいます。
私は、ジェネリックプログラミングを行うためにモジュールとFunctorsを使用するOCamlコードを本番環境に用意しています。歴史的な理由から、私のコードは単一のファイルにまとめられています。今私はもっと時間があります、私はコードをそのようなモジュールのためのファイルに分けていきたいと思います。しかし、私はそれを正しくするために私がしばらくかかったので、私はパフォーマンスを失うことができます恐れている。たとえば、複雑なオブジェクトを数値でラップするモジュールがあるので、一意の表現と高速比較を実行します。私はラップされたオブジェクトを一般的なマップ、セット、およびキャッシュを使ってそれらを使用します。
質問は次のとおりです。
- 私は別のファイルに移動した場合の性能を失うつもりですか?
- OCamlはモジュール、ファンクタなどでコード全体を最適化していますか?
C++では、クラスメソッドを.hに定義すると、コンパイラが短いメソッドなどをインライン展開することになります。OCamlで分離されたファイルを使用してこれを実現することは可能ですか?
ocamlコンパイラとリンカの内部についてはよくわかりませんので、私はあなたの質問に答えられません。しかし、コードをモジュールに分割してパフォーマンスを失った場合、私は非常に驚いています。あなたが数ミリ秒を失ったとしても、あなたのコードの明瞭さが増していく価値があります。 –
C/C++では大きな違いが生じます。私は数百万のオブジェクトを持っています。アクセスごとの一連の参照は非常に悪いことがあります。 – hectorpal
はい、コンパイラはこれらの参照をインライン展開して、実際に必要以上の参照をしないようにする必要があります。どのようにダミーモジュールの束を使ってテストプロジェクトを作成し、それらを分割して同じファイルに保存するかの違いがあるかどうかを調べてみてください。作業コードベースのリファクタリングよりもはるかに少ない作業かもしれません。うまくいけば、ocamloptがコードをインテリジェントに最適化できるという確信が得られることを願っています。 –