Seq(1,2,3)
を呼び出し、List(1,2,3)
を呼び出すと、いずれも1 :: 2 :: 3 :: Nil
になります。 Seq.apply
方法は次のようになりますだけで非常に一般的な方法である:
def apply[A](elems: A*): CC[A] = {
if (elems.isEmpty) empty[A]
else {
val b = newBuilder[A]
b ++= elems
b.result()
}
}
newBuilder
ここ事項のその種のものです。 scala.collection.immutable.Seq.newBuilder
からThat method代表者:
def newBuilder[A]: Builder[A, Seq[A]] = new mutable.ListBuffer
のでSeq
ためBuilder
がmutable.ListBuffer
です。 Seq
は、このように実装され、空のListBuffer
に要素を追加した後、その上にresult
を呼び出すことによって構成されます:
def result: List[A] = toList
/** Converts this buffer to a list. Takes constant time. The buffer is
* copied lazily, the first time it is mutated.
*/
override def toList: List[A] = {
exported = !isEmpty
start
}
List
もBuilder
としてListBuffer
を有しています。それはわずかに異なるが同様の構築プロセスを経る。私はあなたのアルゴリズムの大部分がSeq
に先行することから成り、全体としてSeq.apply(...)
を呼び出さないことを前提としているので、それでは大きな違いは生じません。もしあなたがそれをしたとしても、大きな違いはありません。
あなたは、その動作をしているコードを見ずに見ている動作を引き起こしていると言うことは本当にできません。
これを実証するコードがありますか? – puhlen
'Seq'のデフォルトの実装は実際に' ArrayBuffer'であり、 'List'ではありません。あなたが持っているユースケースは実際には 'List'sのために作られています。なぜなら、tail-recursivelyで実装されているからです。 –
そのような巨大なパフォーマンスの違いが生じるのでしょうか? – Zahari