ActorMaterializer
の作成はかなり安価であり、それらの合理的な増殖は大部分の場合問題ではないはずです。
あなたはActorMaterializer.apply
から始まる呼び出しの連鎖を追いかけた場合(source codeを参照してください)あなたはActorMaterializer
(以上、ActorMaterializerImpl
)は作成時に重要な何かを行っていないことがわかります。
ただ、次のコードは私のラップトップ上の
val sysStart = System.nanoTime()
val actorSystem = ActorSystem("mySystem")
val sysDuration = FiniteDuration(System.nanoTime() - sysStart, TimeUnit.NANOSECONDS)
println(s"System creation: ${sysDuration.toMillis} ms")
val matStart = System.nanoTime()
val materializer = ActorMaterializer()(actorSystem)
val matDuration = FiniteDuration(System.nanoTime() - matStart, TimeUnit.NANOSECONDS)
println(s"Materializer creation: ${matDuration.toMillis} ms")
出力する。この
システムの作成を検討し、あなたにそれがActorSystem
創造と比較する方法のアイデアを与えるために:901ミリ
をマテリアライザー作成:14 ms
しかし、ヨハンがコメントで指摘したように、リソースが漏れないように、マテリアライザーのライフサイクルを適切に管理し、有用でなくなるといつでもshutdown
を呼び出す必要があることを追加することが重要です。
可能であれば、いつでもマテリアライザを渡すことをお勧めします。しかし、これは便利ではないときはいつでも、その作成は安いですが、適切にシャットダウンするように注意してください。
私はライフサイクルとライフサイクル管理がパフォーマンスよりも重要だと思います。マテリアライザーを 'シャットダウン 'すると、実行中のすべてのストリームが突然終了します。アクターにマテリアライザーを作成し、アクターを停止するときにシャットダウンしないと、リソースが漏れています。 – johanandren
これにはっきりと同意します。とにかく、2つの選択肢のどちらかでパフォーマンスに大きな歪みはありません。 'mat.shutdown()'は常にあなたの俳優の 'postStop'メソッドに含まれていなければなりません。 –