Ignore:
Timestamp:
Apr 16, 2008, 2:41:23 AM (17 years ago)
Author:
[email protected]
Message:

Reviewed by Adam Roben.

Cache Gregorian date/time structure on DateInstance objects for 1.027x SunSpider speedup
(1.65x on date-format-xparb, 1.13x on date-format-tofte).

  • kjs/DateMath.h: (KJS::GregorianDateTime::copyFrom): Added. It presumably makes sense to keep GregorianDateTime Noncopiable, so it's not just operator=.
  • kjs/date_object.h: Added a per-object cache.
  • kjs/date_object.cpp: (KJS::DateInstance::DateInstance): (KJS::DateInstance::msToGregorianDateTime): (KJS::dateProtoFuncToString): (KJS::dateProtoFuncToUTCString): (KJS::dateProtoFuncToDateString): (KJS::dateProtoFuncToTimeString): (KJS::dateProtoFuncToLocaleString): (KJS::dateProtoFuncToLocaleDateString): (KJS::dateProtoFuncToLocaleTimeString): (KJS::dateProtoFuncGetFullYear): (KJS::dateProtoFuncGetUTCFullYear): (KJS::dateProtoFuncToGMTString): (KJS::dateProtoFuncGetMonth): (KJS::dateProtoFuncGetUTCMonth): (KJS::dateProtoFuncGetDate): (KJS::dateProtoFuncGetUTCDate): (KJS::dateProtoFuncGetDay): (KJS::dateProtoFuncGetUTCDay): (KJS::dateProtoFuncGetHours): (KJS::dateProtoFuncGetUTCHours): (KJS::dateProtoFuncGetMinutes): (KJS::dateProtoFuncGetUTCMinutes): (KJS::dateProtoFuncGetSeconds): (KJS::dateProtoFuncGetUTCSeconds): (KJS::dateProtoFuncGetTimezoneOffset): (KJS::setNewValueFromTimeArgs): (KJS::setNewValueFromDateArgs): (KJS::dateProtoFuncSetYear): (KJS::dateProtoFuncGetYear): Use the cache when converting.
File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/JavaScriptCore/kjs/date_object.cpp

    r31208 r31937  
    328328DateInstance::DateInstance(JSObject *proto)
    329329  : JSWrapperObject(proto)
    330 {
     330  , m_cache(0)
     331{
     332}
     333
     334DateInstance::~DateInstance()
     335{
     336    delete m_cache;
     337}
     338
     339void DateInstance::msToGregorianDateTime(double milli, bool outputIsUTC, GregorianDateTime& t) const
     340{
     341    if (!m_cache) {
     342        m_cache = new Cache;
     343        m_cache->m_gregorianDateTimeCachedForMS = NaN;
     344        m_cache->m_gregorianDateTimeUTCCachedForMS = NaN;
     345    }
     346
     347    if (outputIsUTC) {
     348        if (m_cache->m_gregorianDateTimeUTCCachedForMS != milli) {
     349            ::msToGregorianDateTime(milli, true, m_cache->m_cachedGregorianDateTimeUTC);
     350            m_cache->m_gregorianDateTimeUTCCachedForMS = milli;
     351        }
     352        t.copyFrom(m_cache->m_cachedGregorianDateTimeUTC);
     353    } else {
     354        if (m_cache->m_gregorianDateTimeCachedForMS != milli) {
     355            ::msToGregorianDateTime(milli, false, m_cache->m_cachedGregorianDateTime);
     356            m_cache->m_gregorianDateTimeCachedForMS = milli;
     357        }
     358        t.copyFrom(m_cache->m_cachedGregorianDateTime);
     359    }
    331360}
    332361
     
    955984
    956985    GregorianDateTime t;
    957     msToGregorianDateTime(milli, utc, t);
     986    thisDateObj->msToGregorianDateTime(milli, utc, t);
    958987    return jsString(formatDate(t) + " " + formatTime(t, utc));
    959988}
     
    9731002
    9741003    GregorianDateTime t;
    975     msToGregorianDateTime(milli, utc, t);
     1004    thisDateObj->msToGregorianDateTime(milli, utc, t);
    9761005    return jsString(formatDateUTCVariant(t) + " " + formatTime(t, utc));
    9771006}
     
    9911020
    9921021    GregorianDateTime t;
    993     msToGregorianDateTime(milli, utc, t);
     1022    thisDateObj->msToGregorianDateTime(milli, utc, t);
    9941023    return jsString(formatDate(t));
    9951024}
     
    10091038
    10101039    GregorianDateTime t;
    1011     msToGregorianDateTime(milli, utc, t);
     1040    thisDateObj->msToGregorianDateTime(milli, utc, t);
    10121041    return jsString(formatTime(t, utc));
    10131042}
     
    10331062
    10341063    GregorianDateTime t;
    1035     msToGregorianDateTime(milli, utc, t);
     1064    thisDateObj->msToGregorianDateTime(milli, utc, t);
    10361065    return formatLocaleDate(t, LocaleDateAndTime);
    10371066#endif
     
    10581087
    10591088    GregorianDateTime t;
    1060     msToGregorianDateTime(milli, utc, t);
     1089    thisDateObj->msToGregorianDateTime(milli, utc, t);
    10611090    return formatLocaleDate(t, LocaleDate);
    10621091#endif
     
    10831112
    10841113    GregorianDateTime t;
    1085     msToGregorianDateTime(milli, utc, t);
     1114    thisDateObj->msToGregorianDateTime(milli, utc, t);
    10861115    return formatLocaleDate(t, LocaleTime);
    10871116#endif
     
    11301159
    11311160    GregorianDateTime t;
    1132     msToGregorianDateTime(milli, utc, t);
     1161    thisDateObj->msToGregorianDateTime(milli, utc, t);
    11331162    return jsNumber(1900 + t.year);
    11341163}
     
    11481177
    11491178    GregorianDateTime t;
    1150     msToGregorianDateTime(milli, utc, t);
     1179    thisDateObj->msToGregorianDateTime(milli, utc, t);
    11511180    return jsNumber(1900 + t.year);
    11521181}
     
    11661195
    11671196    GregorianDateTime t;
    1168     msToGregorianDateTime(milli, utc, t);
     1197    thisDateObj->msToGregorianDateTime(milli, utc, t);
    11691198    return jsString(formatDateUTCVariant(t) + " " + formatTime(t, utc));
    11701199}
     
    11841213
    11851214    GregorianDateTime t;
    1186     msToGregorianDateTime(milli, utc, t);
     1215    thisDateObj->msToGregorianDateTime(milli, utc, t);
    11871216    return jsNumber(t.month);
    11881217}
     
    12021231
    12031232    GregorianDateTime t;
    1204     msToGregorianDateTime(milli, utc, t);
     1233    thisDateObj->msToGregorianDateTime(milli, utc, t);
    12051234    return jsNumber(t.month);
    12061235}
     
    12201249
    12211250    GregorianDateTime t;
    1222     msToGregorianDateTime(milli, utc, t);
     1251    thisDateObj->msToGregorianDateTime(milli, utc, t);
    12231252    return jsNumber(t.monthDay);
    12241253}
     
    12381267
    12391268    GregorianDateTime t;
    1240     msToGregorianDateTime(milli, utc, t);
     1269    thisDateObj->msToGregorianDateTime(milli, utc, t);
    12411270    return jsNumber(t.monthDay);
    12421271}
     
    12561285
    12571286    GregorianDateTime t;
    1258     msToGregorianDateTime(milli, utc, t);
     1287    thisDateObj->msToGregorianDateTime(milli, utc, t);
    12591288    return jsNumber(t.weekDay);
    12601289}
     
    12741303
    12751304    GregorianDateTime t;
    1276     msToGregorianDateTime(milli, utc, t);
     1305    thisDateObj->msToGregorianDateTime(milli, utc, t);
    12771306    return jsNumber(t.weekDay);
    12781307}
     
    12921321
    12931322    GregorianDateTime t;
    1294     msToGregorianDateTime(milli, utc, t);
     1323    thisDateObj->msToGregorianDateTime(milli, utc, t);
    12951324    return jsNumber(t.hour);
    12961325}
     
    13101339
    13111340    GregorianDateTime t;
    1312     msToGregorianDateTime(milli, utc, t);
     1341    thisDateObj->msToGregorianDateTime(milli, utc, t);
    13131342    return jsNumber(t.hour);
    13141343}
     
    13281357
    13291358    GregorianDateTime t;
    1330     msToGregorianDateTime(milli, utc, t);
     1359    thisDateObj->msToGregorianDateTime(milli, utc, t);
    13311360    return jsNumber(t.minute);
    13321361}
     
    13461375
    13471376    GregorianDateTime t;
    1348     msToGregorianDateTime(milli, utc, t);
     1377    thisDateObj->msToGregorianDateTime(milli, utc, t);
    13491378    return jsNumber(t.minute);
    13501379}
     
    13641393
    13651394    GregorianDateTime t;
    1366     msToGregorianDateTime(milli, utc, t);
     1395    thisDateObj->msToGregorianDateTime(milli, utc, t);
    13671396    return jsNumber(t.second);
    13681397}
     
    13821411
    13831412    GregorianDateTime t;
    1384     msToGregorianDateTime(milli, utc, t);
     1413    thisDateObj->msToGregorianDateTime(milli, utc, t);
    13851414    return jsNumber(t.second);
    13861415}
     
    14321461
    14331462    GregorianDateTime t;
    1434     msToGregorianDateTime(milli, utc, t);
     1463    thisDateObj->msToGregorianDateTime(milli, utc, t);
    14351464    return jsNumber(-gmtoffset(t) / minutesPerHour);
    14361465}
     
    14681497
    14691498    GregorianDateTime t;
    1470     msToGregorianDateTime(milli, inputIsUTC, t);
     1499    thisDateObj->msToGregorianDateTime(milli, inputIsUTC, t);
    14711500
    14721501    if (!fillStructuresUsingTimeArgs(exec, args, numArgsToUse, &ms, &t)) {
     
    15011530        // Based on ECMA 262 15.9.5.40 - .41 (set[UTC]FullYear)
    15021531        // the time must be reset to +0 if it is NaN.
    1503         msToGregorianDateTime(0, true, t);
     1532        thisDateObj->msToGregorianDateTime(0, true, t);
    15041533    else {
    15051534        double secs = floor(milli / msPerSecond);
    15061535        ms = milli - secs * msPerSecond;
    1507         msToGregorianDateTime(milli, inputIsUTC, t);
     1536        thisDateObj->msToGregorianDateTime(milli, inputIsUTC, t);
    15081537    }
    15091538   
     
    16251654        // Based on ECMA 262 B.2.5 (setYear)
    16261655        // the time must be reset to +0 if it is NaN.
    1627         msToGregorianDateTime(0, true, t);
     1656        thisDateObj->msToGregorianDateTime(0, true, t);
    16281657    else {   
    16291658        double secs = floor(milli / msPerSecond);
    16301659        ms = milli - secs * msPerSecond;
    1631         msToGregorianDateTime(milli, utc, t);
     1660        thisDateObj->msToGregorianDateTime(milli, utc, t);
    16321661    }
    16331662   
     
    16601689
    16611690    GregorianDateTime t;
    1662     msToGregorianDateTime(milli, utc, t);
     1691    thisDateObj->msToGregorianDateTime(milli, utc, t);
    16631692
    16641693    // NOTE: IE returns the full year even in getYear.
Note: See TracChangeset for help on using the changeset viewer.