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)$ 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]
Substring
を直接 Int
に変換するよりも String
に変換してから Int
に変換した方が速い。String
を Int
のイニシャライザに渡すと Int.init(_: String)
が呼ばれ、 Substring
を Int
のイニシャライザに渡すと Int.init<S: StringProtocol>(_: S, radix: Int = 10)
が呼ばれる。extension FixedWidthInteger { ... @inlinable @inline(__always) public init?(_ description: String) { self.init(description, radix: 10) } }
Substring
の場合は specialize されないから遅い?