Speed up access to history items by caching date computation.
authordarin@apple.com <darin@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Thu, 24 Sep 2009 00:33:29 +0000 (00:33 +0000)
committerdarin@apple.com <darin@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Thu, 24 Sep 2009 00:33:29 +0000 (00:33 +0000)
Patch by Darin Adler <darin@apple.com> on 2009-09-23
Reviewed by Dan Bernstein.

* History/WebHistory.mm:
(getDayBoundaries): Refactored from timeIntervalForBeginningOfDay.
Returns the beginning of the day that the passed time is within and
the beginning of the next day.
(beginningOfDay): Added. Uses getDayBoundaries so it can be fast for
multiple dates within the same day, which is the common case.
(dateKey): Added. Calls beginningOfDay and converts to an integer.
(-[WebHistoryPrivate findKey:forDay:]): Changed to call dateKey
insetad of timeIntervalForBeginningOfDay.

git-svn-id: http://svn.webkit.org/repository/webkit/trunk@48689 268f45cc-cd09-0410-ab3c-d52691b4dbfc

WebKit/mac/ChangeLog
WebKit/mac/History/WebHistory.mm

index 4fb5626..d157ddb 100644 (file)
@@ -1,3 +1,19 @@
+2009-09-23  Darin Adler  <darin@apple.com>
+
+        Reviewed by Dan Bernstein.
+
+        Speed up access to history items by caching date computation.
+
+        * History/WebHistory.mm:
+        (getDayBoundaries): Refactored from timeIntervalForBeginningOfDay.
+        Returns the beginning of the day that the passed time is within and
+        the beginning of the next day.
+        (beginningOfDay): Added. Uses getDayBoundaries so it can be fast for
+        multiple dates within the same day, which is the common case.
+        (dateKey): Added. Calls beginningOfDay and converts to an integer.
+        (-[WebHistoryPrivate findKey:forDay:]): Changed to call dateKey
+        insetad of timeIntervalForBeginningOfDay.
+
 2009-09-23  David Kilzer  <ddkilzer@apple.com>
 
         Move definition of USE(PLUGIN_HOST_PROCESS) from WebKitPrefix.h to Platform.h
index e971aba..6304fd2 100644 (file)
@@ -148,27 +148,42 @@ private:
 
 #pragma mark MODIFYING CONTENTS
 
-static WebHistoryDateKey timeIntervalForBeginningOfDay(NSTimeInterval interval)
+static void getDayBoundaries(NSTimeInterval interval, NSTimeInterval& beginningOfDay, NSTimeInterval& beginningOfNextDay)
 {
     CFTimeZoneRef timeZone = CFTimeZoneCopyDefault();
     CFGregorianDate date = CFAbsoluteTimeGetGregorianDate(interval, timeZone);
     date.hour = 0;
     date.minute = 0;
     date.second = 0;
-    NSTimeInterval result = CFGregorianDateGetAbsoluteTime(date, timeZone);
+    beginningOfDay = CFGregorianDateGetAbsoluteTime(date, timeZone);
+    date.day += 1;
+    beginningOfNextDay = CFGregorianDateGetAbsoluteTime(date, timeZone);
     CFRelease(timeZone);
+}
 
-    // Converting from double to int64_t is safe here as NSDate's useful range
-    // is -2**48 .. 2**47 which will safely fit in an int64_t.
-    return (WebHistoryDateKey)result;
+static inline NSTimeInterval beginningOfDay(NSTimeInterval date)
+{
+    static NSTimeInterval cachedBeginningOfDay = NAN;
+    static NSTimeInterval cachedBeginningOfNextDay;
+    if (!(date >= cachedBeginningOfDay && date < cachedBeginningOfNextDay))
+        getDayBoundaries(date, cachedBeginningOfDay, cachedBeginningOfNextDay);
+    return cachedBeginningOfDay;
+}
+
+static inline WebHistoryDateKey dateKey(NSTimeInterval date)
+{
+    // Converting from double (NSTimeInterval) to int64_t (WebHistoryDateKey) is
+    // safe here because all sensible dates are in the range -2**48 .. 2**47 which
+    // safely fits in an int64_t.
+    return beginningOfDay(date);
 }
 
 // Returns whether the day is already in the list of days,
 // and fills in *key with the key used to access its location
 - (BOOL)findKey:(WebHistoryDateKey*)key forDay:(NSTimeInterval)date
 {
-    ASSERT_ARG(key, key != nil);
-    *key = timeIntervalForBeginningOfDay(date);
+    ASSERT_ARG(key, key);
+    *key = dateKey(date);
     return _entriesByDate->contains(*key);
 }