Añadir cadena mucho más rápido que agregar carácter

estaba haciendohttps://www.hackerrank.com/challenges/30-review-loop problema en el rango de hacker y me encontraba con un problema de tiempo de espera que se resolvió de manera aproximada. Esperaba que alguien aquí pueda explicarme por qué uno es más rápido que el otro. O señalarme la documentación que explica este fenómeno

Si no tiene una cuenta, aquí hay una descripción del problema que alimenta en el número de casos de prueba y luego una cadena cuyo código es crear una cadena con todos los caracteres en los índices impares y una cadena con todos los caracteres en los índices pares Entrada de ejemplo

2
Hacker
Rank

devoluciones

Hce akr
Rn ak

Simple derecho? Aquí está el código que hice.

if let line = readLine(), numOftests = Int(line) {
    for iter in 0..<numOftests {
        var evenString = ""
        var oddString = ""
        var string = readLine()!
        var arrChars = [Character](string.characters)                           //1
        for idx in 0..<string.characters.count {
            if idx % 2 == 0 {
                oddString.append(arrChars[idx])                                 //1
                //oddString.append(string[string.startIndex.advancedBy(idx)])   //2 <= Times out
            }
            else {
                evenString.append(arrChars[idx])                                //1
                //evenString.append(string[string.startIndex.advancedBy(idx)])  //2 <= Times out
            }
        }
        print("\(oddString) \(evenString)")
    }
}

Originalmente utilicé el código comentado. Esto condujo a un tiempo de espera. Para resumir, mi problema es que el uso del sistema de subíndice para una cadena hace que sea mucho más lento que indexar una matriz de caracteres. Me tomó por sorpresa y si no fuera por el grupo de discusión en el rango de piratas informáticos no habría encontrado una solución. Ahora me molesta porque no sé por qué esto haría una diferencia.

Respuestas a la pregunta(1)

Su respuesta a la pregunta