Avatar
import Foundation let line = (1 ... 1_000_000).map { $0.description }.joined(separator: " ") func measure(_ body: @escaping () -> Void) -> TimeInterval { let start = Date.timeIntervalSinceReferenceDate for _ in 0 ..< 10 { body() } let end = Date.timeIntervalSinceReferenceDate return (end - start) / 10 } print(measure { let numbers = line.split(separator: " ").map { Int($0)! } print(numbers.count) }, "[s]") print(measure { let numbers = line.split(separator: " ").map { Int(String($0))! } print(numbers.count) }, "[s]") (edited)
4:22 PM
$ swift -O convert-time.swift 1000000 1000000 1000000 1000000 1000000 1000000 1000000 1000000 1000000 1000000 1.265830397605896 [s] 1000000 1000000 1000000 1000000 1000000 1000000 1000000 1000000 1000000 1000000 0.3805763006210327 [s]
4:22 PM
Substring を直接 Int に変換するよりも String に変換してから Int に変換した方が速い。
4:24 PM
StringInt のイニシャライザに渡すと Int.init(_: String) が呼ばれ、 SubstringInt のイニシャライザに渡すと Int.init<S: StringProtocol>(_: S, radix: Int = 10) が呼ばれる。
4:26 PM
後者は N 進数版だから遅いのかと思ったら↓なのでそれは関係なし。 extension FixedWidthInteger { ... @inlinable @inline(__always) public init?(_ description: String) { self.init(description, radix: 10) } }
4:26 PM
Substring の場合は specialize されないから遅い?