Changeset 31937 in webkit for trunk/JavaScriptCore/kjs


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.
Location:
trunk/JavaScriptCore/kjs
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/JavaScriptCore/kjs/DateMath.h

    r31813 r31937  
    9393        delete [] timeZone;
    9494    }
    95    
     95
    9696    GregorianDateTime(const tm& inTm)
    9797        : second(inTm.tm_sec)
     
    140140    }
    141141
     142    void copyFrom(const GregorianDateTime& rhs)
     143    {
     144        second = rhs.second;
     145        minute = rhs.minute;
     146        hour = rhs.hour;
     147        weekDay = rhs.weekDay;
     148        monthDay = rhs.monthDay;
     149        yearDay = rhs.yearDay;
     150        month = rhs.month;
     151        year = rhs.year;
     152        isDST = rhs.isDST;
     153        utcOffset = rhs.utcOffset;
     154        if (rhs.timeZone) {
     155            int inZoneSize = strlen(rhs.timeZone) + 1;
     156            timeZone = new char[inZoneSize];
     157            strncpy(timeZone, rhs.timeZone, inZoneSize);
     158        } else
     159            timeZone = 0;
     160    }
     161
    142162    int second;
    143163    int minute;
  • 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.
  • trunk/JavaScriptCore/kjs/date_object.h

    r29508 r31937  
    2222#define DATE_OBJECT_H
    2323
     24#include "DateMath.h"
    2425#include "function.h"
    2526#include "JSWrapperObject.h"
     
    2728
    2829namespace KJS {
    29 
    30     struct GregorianDateTime;
    3130
    3231    class FunctionPrototype;
     
    3635    public:
    3736        DateInstance(JSObject *proto);
     37        virtual ~DateInstance();
    3838       
    3939        bool getTime(GregorianDateTime&, int& offset) const;
     
    4444        virtual const ClassInfo *classInfo() const { return &info; }
    4545        static const ClassInfo info;
     46
     47        void msToGregorianDateTime(double, bool outputIsUTC, GregorianDateTime&) const;
     48
     49    private:
     50        struct Cache {
     51            double m_gregorianDateTimeCachedForMS;
     52            GregorianDateTime m_cachedGregorianDateTime;
     53            double m_gregorianDateTimeUTCCachedForMS;
     54            GregorianDateTime m_cachedGregorianDateTimeUTC;
     55        };
     56
     57        mutable Cache* m_cache;
    4658    };
    4759
Note: See TracChangeset for help on using the changeset viewer.