vector
'daki çoğu işlem, trie
gösterimi nedeniyle etkin olarak sabittir. Ancak, performans profilinin splitAt
uygulamasının ne olduğunu anlayamıyorum.Bir vektörde splitAt işlevinin performansı
Bu gibi kütüphane tanımlanır:
override /*IterableLike*/ def splitAt(n: Int): (Vector[A], Vector[A]) = (take(n), drop(n))
take
fonksiyonu aşağıdaki tanımı var
override def take(n: Int): Vector[A] = {
if (n <= 0)
Vector.empty
else if (startIndex + n < endIndex)
dropBack0(startIndex + n)
else
this
}
ve dropBack0
aşağıdaki tanım var
private def dropBack0(cutIndex: Int): Vector[A] = {
val blockIndex = (cutIndex - 1) & ~31
val xor = startIndex^(cutIndex - 1)
val d = requiredDepth(xor)
val shift = (startIndex & ~((1 << (5*d))-1))
val s = new Vector(startIndex-shift, cutIndex-shift, blockIndex-shift)
s.initFrom(this)
s.dirty = dirty
s.gotoPosWritable(focus, blockIndex, focus^blockIndex)
s.preClean(d)
s.cleanRightEdge(cutIndex-shift)
s
}
As görebilirsiniz dropBack0
bazı güzel co yapıyor yapıştırılmış ameliyat.
splitAt
etkin bir şekilde sabit performansa sahip mi, yoksa daha mı kötü? Etkin olarak sabit gibi görünüyor.