Ignore:
Timestamp:
Jun 29, 2010, 3:01:29 PM (15 years ago)
Author:
[email protected]
Message:

2010-06-29 Michael Saboff <[email protected]>

Reviewed by Darin Adler.

Bug 41238 - RegExp performance slow on Dromaeo benchmark

Other javascript engines appear to cache prior results of regular
expression operations.

Suggest adding some sort of caching mechanism to regular expression
processing.

Added a single entry cache of match() results to RegExp class.

Also added performance improvements to UString == operator.
First check the impls for equality. Then get the length of
each of the non-null impls. Next check the sizes for equality.
Then check the data for the case of different impls that point
to the same data (most likely due to substrings from the beginning of
another string). Lastly we check the underlying data for equality.

  • runtime/RegExp.cpp: (JSC::RegExp::RegExp): (JSC::RegExp::match):
  • runtime/RegExp.h:
  • runtime/UString.h: (JSC::operator==):
File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/JavaScriptCore/runtime/RegExp.cpp

    r61927 r62148  
    5252    , m_constructionError(0)
    5353    , m_numSubpatterns(0)
     54    , m_lastMatchStart(-1)
    5455{
    5556    compile(globalData);
     
    6162    , m_constructionError(0)
    6263    , m_numSubpatterns(0)
     64    , m_lastMatchStart(-1)
    6365{
    6466    // NOTE: The global flag is handled on a case-by-case basis by functions like
     
    110112        ovector->resize(0);
    111113
    112     if (static_cast<unsigned>(startOffset) > s.size() || s.isNull())
     114    if (static_cast<unsigned>(startOffset) > s.size() || s.isNull()) {
     115        m_lastMatchString = UString();
     116        m_lastMatchStart = -1;
     117        m_lastOVector.shrink(0);
    113118        return -1;
     119    }
     120   
     121    // Perform check to see if this match call is the same as the last match invocation
     122    // and if it is return the prior result.
     123    if ((startOffset == m_lastMatchStart) && (s.rep() == m_lastMatchString.rep())) {
     124        if (ovector)
     125            *ovector = m_lastOVector;
     126       
     127        if (m_lastOVector.isEmpty())
     128            return -1;
     129
     130        return m_lastOVector.at(0);
     131    }
    114132
    115133#if ENABLE(YARR_JIT)
     
    148166                ovector->clear();
    149167        }
     168       
     169        m_lastMatchString = s;
     170        m_lastMatchStart = startOffset;
     171
     172        if (ovector)
     173            m_lastOVector = *ovector;
     174        else
     175            m_lastOVector = nonReturnedOvector;
     176
    150177        return result;
    151178    }
     179
     180    m_lastMatchString = UString();
     181    m_lastMatchStart = -1;
     182    m_lastOVector.shrink(0);
    152183
    153184    return -1;
Note: See TracChangeset for help on using the changeset viewer.