オリジナル
を解決するために暗黙を使用しているのに対し、暗黙をtoString.map使用していることが原因である可能性があります。WrappedStringtoString.toArray.mapWrappedArraymap
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
}
WrappedStringStringBuilderビルダーとしてを使用します:
def +=(x: Char): this.type = { append(x); this }
def append(x: Any): StringBuilder = {
underlying append String.valueOf(x)
this
}
のString.valueOf呼び出しでは、インスタンスでAnyJavaを使用し、場合によっては最初にボックス化されます。これらの余分な操作は、アレイビルダーのおそらく短いコードパスとは対照的に、速度の違いの原因となる可能性があります。Object.toStringChar
これは推測ですが、測定する必要があります。
編集
toDigit改訂後も一般的なポイントは変わりませんが、メソッドが読み間違えたときに翻訳された文字列ではなくIntシーケンス(または同様のもの)を返すため、間違った暗黙を参照しました。
toDigitLowPriorityImplicits.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
}
}