2017-05-29 6 views
1

Clojureのgo-blocksとGoのゴルーチンの実装の特性とその結果のパフォーマンスを理解しようとしています。Clojureのgo-blocksとGoのゴルーチンの使用の比較

Clojure >!!<!!は、スレッドが明示的に作成されている場合にのみ使用できる(そうでない場合は「唯一の」メインスレッドがブロックされている)ことを意味します。 goマクロは複数の "プロセス"を混乱させる暗黙の状態マシンを管理しているため、>!<!は駐車しています。

しかし、Goでは、これは実行時にすべて非表示になっています.Goroutinesは両方の役割を果たします。

Clojureコードは、パーキングバージョンのみを使用しているときにGoと同じであると言うのは正しいですか? goマクロにはスレッドプールがあるので、これはGoのスレッドプールの根底にあるゴルーチンのようなものです。 Clojureは明示的にClojureコードを管理していますが、Goは実行時にこれを実行するため、パフォーマンスは悪化します。

+1

非常に珍しいユースケースがない限り、スレッドおよび/または擬似スレッド切り替えのコストを心配する必要はありません。あなた自身のコードは通常、CPU時間の90〜99%を消費します。 –

+2

"ランタイム"は、パフォーマンスが無料となる魔法の場所ではありません。 ClojureがClojureでこれを行うという事実は、それほどインパクトのあるものではありません。パフォーマンスが重要な場合、javacで生成されるものと同じようなJVMバイトコードが可能です。 – amalloy

+1

これらのコンストラクトのパフォーマンスが不思議であれば、それを探索するためのおもちゃプログラムを構築することをお勧めします。 2つの環境がまったく違うので、2つのものが「同等」であるかどうかは、何よりも定義の問題です。より速いものを推測するのは難しいです(または、Alan Thompson氏のメモによると、 。 – twotwotwo

答えて

1

大雑把に言えば、Clojureのgoマクロの動作は、「パーキング」と>!を使用する場合の「ゴルーチン」に似ています。

はしかし、パフォーマンスの影響は、ワークロードと環境の両方に非常に特異的である可能性が高い:オペレーティングシステム、コア数、ヒープサイズなど

のClojureのgoマクロは、状態マシンにその内容をコンパイル多くの小さな機能で構成されており、dispatched、標準Java thread poolです。現在、Clojureの実装で実装されている他のスケジューリングはありません。

Go言語には、内部ランタイムの知識に基づいてより洗練されたスケジューリングを実行できる「ゴルーチン」用の独自の内部スケジューラがあります。また、Clojureのgoマクロでは不可能な "goroutines"の実行時検査を提供します。

関連する問題