C プログラムから呼び出されるライブラリとして Haskell を使用している場合、それを呼び出すとパフォーマンスにどのような影響がありますか? たとえば、たとえば 20kB のデータのワールド データ セットに問題があり、次のようなものを実行したい場合:
// Go through my 1000 actors and have them make a decision based on
// HaskellCode() function, which is compiled Haskell I'm accessing through
// the FFI. As an argument, send in the SAME 20kB of data to EACH of these
// function calls, and some actor specific data
// The 20kB constant data defines the environment and the actor specific
// data could be their personality or state
for(i = 0; i < 1000; i++)
actor[i].decision = HaskellCode(20kB of data here, actor[i].personality);
ここで何が起こるでしょうか - その 20kB のデータを、Haskell コードによってアクセスされるグローバルな不変参照としてどこかに保持することは可能でしょうか? それとも毎回そのデータのコピーを作成する必要がありますか?
懸念されるのは、このデータがさらに大きくなる可能性があることです。また、Haskell コードの複数の呼び出しで使用される不変データの同じパターンを使用して、はるかに大きなデータ セットに作用するアルゴリズムを書きたいと考えています。
また、dispatch_apply() GCD や Parallel.ForEach(..) C# のように、これを並列化したいです。Haskell の外で並列化する私の論理的根拠は、常に多くの個別の関数呼び出し、つまり 1000 のアクターを操作することを知っているためです。そのため、Haskell 関数内で細粒度の並列化を使用することは、C レベルで管理することに勝るものはありません。FFI Haskell インスタンスを「スレッドセーフ」で実行していますか?これを実現するにはどうすればよいですか? 並列実行を開始するたびに Haskell インスタンスを初期化する必要がありますか? (私がしなければならない場合は遅いようです..) 良いパフォーマンスでこれを達成するにはどうすればよいですか?