@@ -7,6 +7,8 @@ import Foundation
77
88typealias CMUpdateClosure = ( _ result: [ CompileMeasure ] , _ didComplete: Bool , _ didCancel: Bool ) -> ( )
99
10+ fileprivate let regex = try ! NSRegularExpression ( pattern: " ^ \\ d* \\ .? \\ d*ms \\ t/ " , options: [ ] )
11+
1012protocol LogProcessorProtocol : class {
1113 var rawMeasures : [ String : RawMeasure ] { get set }
1214 var updateHandler : CMUpdateClosure ? { get set }
@@ -32,25 +34,30 @@ extension LogProcessorProtocol {
3234 // MARK: Private methods
3335
3436 private func process( text: String ) {
37+ let text = text as NSString
3538 let characterSet = CharacterSet ( charactersIn: " \r \" " )
36- var remainingRange = text. startIndex..< text. endIndex
37- let regex = try ! NSRegularExpression ( pattern: " ^ \\ d* \\ .? \\ d*ms \\ t/ " , options: [ ] )
39+ var remainingRange = NSMakeRange ( 0 , text. length)
3840
3941 rawMeasures. removeAll ( )
4042
4143 processingDidStart ( )
4244
43- while let nextRange = text. rangeOfCharacter ( from: characterSet, options: [ ] , range: remainingRange) {
44- let text = String ( text [ remainingRange. lowerBound..< nextRange. upperBound] )
45-
45+ while true {
46+ let nextRange = text. rangeOfCharacter ( from: characterSet, options: . literal, range: remainingRange)
47+ guard nextRange. location != NSNotFound else { break }
48+
49+ let beginIdx = remainingRange. lowerBound
50+ let endIdx = nextRange. upperBound
51+ let textCount = endIdx - beginIdx
52+ let text = text. substring ( with: NSMakeRange ( beginIdx, textCount) )
53+
4654 defer {
47- remainingRange = nextRange . upperBound ..< remainingRange. upperBound
55+ remainingRange = NSMakeRange ( endIdx , remainingRange. upperBound - endIdx )
4856 }
4957
50- // From LuizZak: (text as NSString).length improves the performance by about 2x compared to text.characters.count
51- let range = NSMakeRange ( 0 , ( text as NSString ) . length)
58+ let range = NSMakeRange ( 0 , textCount)
5259 guard let match = regex. firstMatch ( in: text, options: [ ] , range: range) else { continue }
53-
60+
5461 let timeString = text [ ..< text. index ( text. startIndex, offsetBy: match. range. length - 4 ) ]
5562 if let time = Double ( timeString) {
5663 let value = String ( text [ text. index ( text. startIndex, offsetBy: match. range. length - 1 ) ... ] )
0 commit comments