アプリケーション サーバーを作成していますが、メッセージ送信ループがあります。メッセージはフィールドで構成されているため、フィールドを反復処理する反復子と見なすことができます。また、メッセージ ループによって処理されるメッセージ キューがありますが、ループはいつでも中断でき (たとえば、ソケット バッファーがいっぱいになった場合)、後で再開できます。現在の実装は次のようになります。
private val messageQueue: Queue[Iterator[Field]]
sent = 0
breakable {
for (iterator <- messageQueue) {
for (field <- iterator) {
... breakable ...
}
sent += 1
}
} finally messageQueue.trimStart(sent)
これは機能し、悪くはありませんが、++ 演算子を使用して反復子を連結する反復子でキューを置き換えることができれば、コードを少しきれいにできると思いました。言う:
private val messageQueue: Iterator[Field] = message1.iterator ++ message2.iterator ++ ...
breakable {
for (field <- messageQueue) {
... breakable ...
}
}
コードはよりきれいに見えますが、パフォーマンスの問題があります。連結された反復子は内部で (不均衡な) ツリーを形成するため、next() 操作には O(n) の時間がかかります。したがって、反復には全体で O(n^2) の時間がかかります。
要約すると、メッセージは 1 回だけ処理する必要があるため、キューを Traversable にする必要はありません。Iterator (TraversableOnce) で十分です。メッセージ キューを連続した反復子のコレクションとして表示したいのですが、++ にはパフォーマンスの問題があります。コードをよりクリーンにすると同時に効率的な優れたソリューションはありますか?