High number of cache miss on localTimeOffset
authorticaiolima@gmail.com <ticaiolima@gmail.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Wed, 7 Aug 2019 12:41:01 +0000 (12:41 +0000)
committerticaiolima@gmail.com <ticaiolima@gmail.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Wed, 7 Aug 2019 12:41:01 +0000 (12:41 +0000)
https://bugs.webkit.org/show_bug.cgi?id=200444

Reviewed by Darin Adler.

This patch is separating the `LocalTimeOffsetCache` for each
`WTF::TimeType` to avoid constant cache miss on pathological cases
where `gregorianDateTimeToMS` and `msToGregorianDateTime` are
intercaleted with `inputTimeType ==  WTF::LocalTime`. Such case
happens during execution of Facebook Messenger
(https://www.messenger.com).

* runtime/JSDateMath.cpp:
(JSC::localTimeOffset):
(JSC::gregorianDateTimeToMS):
* runtime/VM.cpp:
(JSC::VM::resetDateCache):
* runtime/VM.h:
(JSC::LocalTimeOffsetCache::LocalTimeOffsetCache):
(JSC::LocalTimeOffsetCache::reset):

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

Source/JavaScriptCore/ChangeLog
Source/JavaScriptCore/runtime/JSDateMath.cpp
Source/JavaScriptCore/runtime/VM.cpp
Source/JavaScriptCore/runtime/VM.h

index 48c6469..4b50f3c 100644 (file)
@@ -1,3 +1,26 @@
+2019-08-07  Caio Lima  <ticaiolima@gmail.com>
+
+        High number of cache miss on localTimeOffset
+        https://bugs.webkit.org/show_bug.cgi?id=200444
+
+        Reviewed by Darin Adler.
+
+        This patch is separating the `LocalTimeOffsetCache` for each
+        `WTF::TimeType` to avoid constant cache miss on pathological cases
+        where `gregorianDateTimeToMS` and `msToGregorianDateTime` are
+        intercaleted with `inputTimeType ==  WTF::LocalTime`. Such case
+        happens during execution of Facebook Messenger
+        (https://www.messenger.com).
+
+        * runtime/JSDateMath.cpp:
+        (JSC::localTimeOffset):
+        (JSC::gregorianDateTimeToMS):
+        * runtime/VM.cpp:
+        (JSC::VM::resetDateCache):
+        * runtime/VM.h:
+        (JSC::LocalTimeOffsetCache::LocalTimeOffsetCache):
+        (JSC::LocalTimeOffsetCache::reset):
+
 2019-08-06  Yusuke Suzuki  <ysuzuki@apple.com>
 
         [JSC] sampling-profiler can see garbage Wasm::Callee* pointer which is HashTable deleted / empty values
index 0715d4e..fc0cd3a 100644 (file)
@@ -131,14 +131,16 @@ static inline int msToWeekDay(double ms)
 // If this function is called with NaN it returns NaN.
 static LocalTimeOffset localTimeOffset(VM& vm, double ms, WTF::TimeType inputTimeType = WTF::UTCTime)
 {
-    LocalTimeOffsetCache& cache = vm.localTimeOffsetCache;
+    LocalTimeOffsetCache& cache = inputTimeType == WTF::LocalTime
+        ? vm.localTimeOffsetCache : vm.utcTimeOffsetCache;
+
     double start = cache.start;
     double end = cache.end;
-    WTF::TimeType cachedTimeType = cache.timeType;
 
-    if (cachedTimeType == inputTimeType && start <= ms) {
+    if (start <= ms) {
         // If the time fits in the cached interval, return the cached offset.
-        if (ms <= end) return cache.offset;
+        if (ms <= end)
+            return cache.offset;
 
         // Compute a possible new interval end.
         double newEnd = end + cache.increment;
@@ -183,7 +185,6 @@ static LocalTimeOffset localTimeOffset(VM& vm, double ms, WTF::TimeType inputTim
     cache.start = ms;
     cache.end = ms;
     cache.increment = msPerMonth;
-    cache.timeType = inputTimeType;
     return offset;
 }
 
@@ -192,6 +193,7 @@ double gregorianDateTimeToMS(VM& vm, const GregorianDateTime& t, double milliSec
     double day = dateToDaysFrom1970(t.year(), t.month(), t.monthDay());
     double ms = timeToMS(t.hour(), t.minute(), t.second(), milliSeconds);
     double localTimeResult = (day * WTF::msPerDay) + ms;
+
     double localToUTCTimeOffset = inputTimeType == LocalTime
         ? localTimeOffset(vm, localTimeResult, inputTimeType).offset : 0;
 
index c039180..7ad8af2 100644 (file)
@@ -733,6 +733,7 @@ VM::ClientData::~ClientData()
 
 void VM::resetDateCache()
 {
+    utcTimeOffsetCache.reset();
     localTimeOffsetCache.reset();
     cachedDateString = String();
     cachedDateStringValue = std::numeric_limits<double>::quiet_NaN();
index 690040d..c10f37e 100644 (file)
@@ -185,7 +185,6 @@ struct LocalTimeOffsetCache {
         : start(0.0)
         , end(-1.0)
         , increment(0.0)
-        , timeType(WTF::UTCTime)
     {
     }
 
@@ -195,14 +194,12 @@ struct LocalTimeOffsetCache {
         start = 0.0;
         end = -1.0;
         increment = 0.0;
-        timeType = WTF::UTCTime;
     }
 
     LocalTimeOffset offset;
     double start;
     double end;
     double increment;
-    WTF::TimeType timeType;
 };
 
 class QueuedTask {
@@ -809,6 +806,7 @@ public:
     JSObject* stringRecursionCheckFirstObject { nullptr };
     HashSet<JSObject*> stringRecursionCheckVisitedObjects;
     
+    LocalTimeOffsetCache utcTimeOffsetCache;
     LocalTimeOffsetCache localTimeOffsetCache;
 
     String cachedDateString;