Browse Source

Timeline now uses CFAbsoluteTime instead of NSDate to avoid excess overhead.

Christian Noon 10 years ago
parent
commit
e68235ff24
5 changed files with 26 additions and 26 deletions
  1. 1 1
      Source/Download.swift
  2. 6 6
      Source/Request.swift
  3. 3 3
      Source/ResponseSerialization.swift
  4. 15 15
      Source/Timeline.swift
  5. 1 1
      Source/Upload.swift

+ 1 - 1
Source/Download.swift

@@ -211,7 +211,7 @@ extension Request {
             totalBytesWritten: Int64,
             totalBytesExpectedToWrite: Int64)
         {
-            if initialResponseTime == nil { initialResponseTime = NSDate() }
+            if initialResponseTime == nil { initialResponseTime = CFAbsoluteTimeGetCurrent() }
 
             if let downloadTaskDidWriteData = downloadTaskDidWriteData {
                 downloadTaskDidWriteData(

+ 6 - 6
Source/Request.swift

@@ -48,8 +48,8 @@ public class Request {
     /// The progress of the request lifecycle.
     public var progress: NSProgress { return delegate.progress }
 
-    var startTime: NSDate?
-    var endTime: NSDate?
+    var startTime: CFAbsoluteTime?
+    var endTime: CFAbsoluteTime?
 
     // MARK: - Lifecycle
 
@@ -67,7 +67,7 @@ public class Request {
             delegate = TaskDelegate(task: task)
         }
 
-        delegate.queue.addOperationWithBlock { self.endTime = NSDate() }
+        delegate.queue.addOperationWithBlock { self.endTime = CFAbsoluteTimeGetCurrent() }
     }
 
     // MARK: - Authentication
@@ -157,7 +157,7 @@ public class Request {
         Resumes the request.
     */
     public func resume() {
-        if startTime == nil { startTime = NSDate() }
+        if startTime == nil { startTime = CFAbsoluteTimeGetCurrent() }
 
         task.resume()
         NSNotificationCenter.defaultCenter().postNotificationName(NotificationNames.TaskDidResume, object: task)
@@ -206,7 +206,7 @@ public class Request {
         var data: NSData? { return nil }
         var error: NSError?
 
-        var initialResponseTime: NSDate?
+        var initialResponseTime: CFAbsoluteTime?
         var credential: NSURLCredential?
 
         init(task: NSURLSessionTask) {
@@ -393,7 +393,7 @@ public class Request {
         }
 
         func URLSession(session: NSURLSession, dataTask: NSURLSessionDataTask, didReceiveData data: NSData) {
-            if initialResponseTime == nil { initialResponseTime = NSDate() }
+            if initialResponseTime == nil { initialResponseTime = CFAbsoluteTimeGetCurrent() }
 
             if let dataTaskDidReceiveData = dataTaskDidReceiveData {
                 dataTaskDidReceiveData(session, dataTask, data)

+ 3 - 3
Source/ResponseSerialization.swift

@@ -119,14 +119,14 @@ extension Request {
                 self.delegate.error
             )
 
-            let requestCompletedTime = self.endTime ?? NSDate()
+            let requestCompletedTime = self.endTime ?? CFAbsoluteTimeGetCurrent()
             let initialResponseTime = self.delegate.initialResponseTime ?? requestCompletedTime
 
             let timeline = Timeline(
-                requestStartTime: self.startTime ?? NSDate(),
+                requestStartTime: self.startTime ?? CFAbsoluteTimeGetCurrent(),
                 initialResponseTime: initialResponseTime,
                 requestCompletedTime: requestCompletedTime,
-                serializationCompletedTime: NSDate()
+                serializationCompletedTime: CFAbsoluteTimeGetCurrent()
             )
 
             let response = Response<T.SerializedObject, T.ErrorObject>(

+ 15 - 15
Source/Timeline.swift

@@ -25,16 +25,16 @@ import Foundation
 /// Responsible for computing the timing metrics for the complete lifecycle of a `Request`.
 public struct Timeline {
     /// The time the request was initialized.
-    public let requestStartTime: NSDate
+    public let requestStartTime: CFAbsoluteTime
 
     /// The time the first bytes were received from or sent to the server.
-    public let initialResponseTime: NSDate
+    public let initialResponseTime: CFAbsoluteTime
 
     /// The time when the request was completed.
-    public let requestCompletedTime: NSDate
+    public let requestCompletedTime: CFAbsoluteTime
 
     /// The time when the response serialization was completed.
-    public let serializationCompletedTime: NSDate
+    public let serializationCompletedTime: CFAbsoluteTime
 
     /// The time interval in seconds from the time the request started to the initial response from the server.
     public let latency: NSTimeInterval
@@ -46,19 +46,19 @@ public struct Timeline {
     public let totalDuration: NSTimeInterval
 
     init(
-        requestStartTime: NSDate,
-        initialResponseTime: NSDate,
-        requestCompletedTime: NSDate,
-        serializationCompletedTime: NSDate)
+        requestStartTime: CFAbsoluteTime,
+        initialResponseTime: CFAbsoluteTime,
+        requestCompletedTime: CFAbsoluteTime,
+        serializationCompletedTime: CFAbsoluteTime)
     {
         self.requestStartTime = requestStartTime
         self.initialResponseTime = initialResponseTime
         self.requestCompletedTime = requestCompletedTime
         self.serializationCompletedTime = serializationCompletedTime
 
-        self.latency = initialResponseTime.timeIntervalSinceDate(requestStartTime)
-        self.requestDuration = requestCompletedTime.timeIntervalSinceDate(requestStartTime)
-        self.totalDuration = serializationCompletedTime.timeIntervalSinceDate(requestStartTime)
+        self.latency = initialResponseTime - requestStartTime
+        self.requestDuration = requestCompletedTime - requestStartTime
+        self.totalDuration = serializationCompletedTime - requestStartTime
     }
 }
 
@@ -90,10 +90,10 @@ extension Timeline: CustomDebugStringConvertible {
     /// duration and the total duration.
     public var debugDescription: String {
         let timings = [
-            "\"Request Start Time\": \(requestStartTime.timeIntervalSince1970)",
-            "\"Initial Response Time\": \(initialResponseTime.timeIntervalSince1970)",
-            "\"Request Completed Time\": \(requestCompletedTime.timeIntervalSince1970)",
-            "\"Serialization Completed Time\": \(serializationCompletedTime.timeIntervalSince1970)",
+            "\"Request Start Time\": \(requestStartTime)",
+            "\"Initial Response Time\": \(initialResponseTime)",
+            "\"Request Completed Time\": \(requestCompletedTime)",
+            "\"Serialization Completed Time\": \(serializationCompletedTime)",
             "\"Latency\": \(latency) secs",
             "\"Request Duration\": \(requestDuration) secs",
             "\"Total Duration\": \(totalDuration) secs"

+ 1 - 1
Source/Upload.swift

@@ -359,7 +359,7 @@ extension Request {
             totalBytesSent: Int64,
             totalBytesExpectedToSend: Int64)
         {
-            if initialResponseTime == nil { initialResponseTime = NSDate() }
+            if initialResponseTime == nil { initialResponseTime = CFAbsoluteTimeGetCurrent() }
 
             if let taskDidSendBodyData = taskDidSendBodyData {
                 taskDidSendBodyData(session, task, bytesSent, totalBytesSent, totalBytesExpectedToSend)