オリジナル
を解決するために暗黙を使用しているのに対し、暗黙をtoString.map
使用していることが原因である可能性があります。WrappedString
toString.toArray.map
WrappedArray
map
map
で定義されているように、見てみましょうTraversableLike
:
def map[B, That](f: A => B)(implicit bf: CanBuildFrom[Repr, B, That]): That = {
val b = bf(repr)
b.sizeHint(this)
for (x <- this) b += f(x)
b.result
}
WrappedString
StringBuilder
ビルダーとしてを使用します:
def +=(x: Char): this.type = { append(x); this }
def append(x: Any): StringBuilder = {
underlying append String.valueOf(x)
this
}
のString.valueOf
呼び出しでは、インスタンスでAny
Javaを使用し、場合によっては最初にボックス化されます。これらの余分な操作は、アレイビルダーのおそらく短いコードパスとは対照的に、速度の違いの原因となる可能性があります。Object.toString
Char
これは推測ですが、測定する必要があります。
編集
toDigit
改訂後も一般的なポイントは変わりませんが、メソッドが読み間違えたときに翻訳された文字列ではなくIntシーケンス(または同様のもの)を返すため、間違った暗黙を参照しました。
toDigit
LowPriorityImplicits.fallbackStringCanBuildFrom[T]: CanBuildFrom[String, T, immutable.IndexedSeq[T]]
、withを使用T = Int
します。これは、一般的なIndexedSeqビルダーに依存します。
toDigitFast
タイプが暗黙の直接配列を使用しCanBuildFrom[Array[_], T, Array[T]]
ます。これは間違いなく高速です。
次のCBFをtoDigit
明示的に渡すと、2つのメソッドがパーになります。
object FastStringToArrayBuild {
def canBuildFrom[T : ClassManifest] = new CanBuildFrom[String, T, Array[T]] {
private def newBuilder = scala.collection.mutable.ArrayBuilder.make()
def apply(from: String) = newBuilder
def apply() = newBuilder
}
}