Clojureのgo-blocksとGoのゴルーチンの実装の特性とその結果のパフォーマンスを理解しようとしています。Clojureのgo-blocksとGoのゴルーチンの使用の比較
Clojure >!!
と<!!
は、スレッドが明示的に作成されている場合にのみ使用できる(そうでない場合は「唯一の」メインスレッドがブロックされている)ことを意味します。 go
マクロは複数の "プロセス"を混乱させる暗黙の状態マシンを管理しているため、>!
と<!
は駐車しています。
しかし、Goでは、これは実行時にすべて非表示になっています.Goroutinesは両方の役割を果たします。
Clojureコードは、パーキングバージョンのみを使用しているときにGoと同じであると言うのは正しいですか? go
マクロにはスレッドプールがあるので、これはGoのスレッドプールの根底にあるゴルーチンのようなものです。 Clojureは明示的にClojureコードを管理していますが、Goは実行時にこれを実行するため、パフォーマンスは悪化します。
非常に珍しいユースケースがない限り、スレッドおよび/または擬似スレッド切り替えのコストを心配する必要はありません。あなた自身のコードは通常、CPU時間の90〜99%を消費します。 –
"ランタイム"は、パフォーマンスが無料となる魔法の場所ではありません。 ClojureがClojureでこれを行うという事実は、それほどインパクトのあるものではありません。パフォーマンスが重要な場合、javacで生成されるものと同じようなJVMバイトコードが可能です。 – amalloy
これらのコンストラクトのパフォーマンスが不思議であれば、それを探索するためのおもちゃプログラムを構築することをお勧めします。 2つの環境がまったく違うので、2つのものが「同等」であるかどうかは、何よりも定義の問題です。より速いものを推測するのは難しいです(または、Alan Thompson氏のメモによると、 。 – twotwotwo