2013-03-05 19 views
28

私はソフトリアルタイムアプリケーションのためにハスケルを考えています。私はおそらく俳優を、それが価値あるもののために使うだろう。誰かがHaskellのリアルタイムの現在の状態を把握しているかどうかは疑問だ。具体的には、GCがアプリを一時停止する問題です。私は広範囲にグーグルで行きましたが、2年以上前から多くの議論がありましたが、現在は何もありません。ここで私が見つけた参照のカップルは、次のとおりです。私が読んだ古いものの多くはハスケルソフトリアルタイムの現在の状態

Using Haskell for sizable real-time systems: how (if?)?

How about Haskell's GC performance for soft realtime application like games?

状況は(時)だっ向上すると考えられていることを示唆しています。それはありますか?

2年前も、ハスケルのアプリケーションがGCの一時停止を確実に1ミリ秒または2秒に抑えるように調整できることを示唆するコメントがいくつかありました。これは現実的なようですか?

+0

私は、GCは、エフェクトなどのxmonadまたはFRAGを一時停止します見ていません。プロファイリングツールは、たくさんのゴミを生成しないように簡単に十分です。 –

+0

私はハスケルの俳優に少し注意したいと思うが、GHCスレッドはずっとよく研究されている –

+0

この質問は経験的に答えるのはかなり難しいと思うが、私は定期的にソフトミリタリーのアプリケーションかなり標準的なコモディティハードウェアで。 –

答えて

29

したがって、「リアルタイム」に対する懸念は、GCコレクションによって導入された遅延です。

GHCはマルチコアガベージコレクタを使用しています(a branchper-thread local heaps)。もともと、マルチコアパフォーマンス(各コアcan collect independently)を改善するために開発されたのは、頻繁な世界的な同期停止のコストを削減することで、同じ理由でソフトリアルタイムにも役立ちます。しかし、並列GCが存在していたとしても、2013年現在、スレッドごとのローカルヒープはまだメインGHCにマージされていません。

ゲームの場合は、スレッドを使用することでこれを悪用できるので、世界のローカルコレクションの必要性が軽減されます。

グローバルヒープでは、長命のオブジェクトの場合でも、GCのリスクがあります。しかしながら、例えばThreadScopeはここで障害物を取り除きます。私は、GHCで管理されたネットワークスタックを介して目立つGC一時停止なしでリアルタイムの1080pビデオをストリーミングすることを見てきました。

これらのチューンアップがなくても、物事は「うまくいくかもしれません」。 Fragはほとんど最適化が必要なく、10年近く前にはソフトリアルタイムでした。

は最後に、パフォーマンスを改善するための多くのツールとGHCのフラグがあります

コーディングがあります:ボックス化されていないタイプ(GCなし)を使用すると、遅延構造の割り当てが最小限に抑えられます。長寿命のデータはパックされた形式で保存してください。テストとベンチマーク。

あなたは大丈夫だと思います。

+1

GHC版のスレッドごとのヒープが導入されたドン? GHCのドキュメントに詳細はありますか? (私はグーグルで試してみましたが、何か特別なものは見つかりませんでした) – Qrilka

+2

これを再訪してくれてありがとう。 GHCステータスレポートによると、スレッドごとのGCはブランチに残り、メインラインにはありません。私は報告書とステータスにリンクしています。 –

2

GC休止に問題は発生していません。すべての遅延リストを使用していない限り、ゴミを多量に生成しないでください。

しかし、スカイはマルチスレッドアプリケーションではあまり明るくありません。 GHCは依然としてスレッドの優先順位を持つスケジューラーを持っていません。重いバックグラウンド処理のためにスレッドを使用すると、簡単にイベントループを枯渇させることができます。

+1

私はGHCのstricness分析(http://www.haskell.org/haskellwiki/Performance/Strictness)に精通していません。私の理解は、多くの場合、それはリストを含む物を自動的に厳密にするということです。 (最適化レベルが十分に高く設定されていると仮定します)GHCが適切な場所で厳密に行うことができるようにコードを作成するようにしてください。 – rlkw1024

0

GHC 8.2.1には、コンパクトリージョンと呼ばれる便利な機能があります。

私の理解から、セミマニュアルメモリ管理の一種と思われます。 長寿命のデータをコンパクト領域に格納することができ、ガベージコレクタはそれをトレースしません。コンパクト領域に何かの参照がある場合、コンパクト領域全体が生きています。地域内の何も参照がないと、割り当てが解除されます。リージョンの内容を機能的に更新すると、新しいリージョンでそのリージョンを再割り当てすることができ、古いリージョンは解放されます。

http://ezyang.com/compact.html
https://hackage.haskell.org/package/compact-0.1.0.1/docs/Data-Compact.html

関連する問題