Changeset 65834 in webkit


Ignore:
Timestamp:
Aug 23, 2010 2:59:00 PM (14 years ago)
Author:
oliver@apple.com
Message:

2010-08-23 Oliver Hunt <oliver@apple.com>

Reviewed by Gavin Barraclough.

JSON.stringify is much slower than Firefox on particular pathological input
https://bugs.webkit.org/show_bug.cgi?id=44456

Make StringBuilder::reserveCapacity reserve additional space so we don't end up
repeatedly copying the entire result string.

  • runtime/StringBuilder.h: (JSC::StringBuilder::append): (JSC::StringBuilder::reserveCapacity):
Location:
trunk/JavaScriptCore
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/JavaScriptCore/ChangeLog

    r65827 r65834  
     12010-08-23  Oliver Hunt  <oliver@apple.com>
     2
     3        Reviewed by Gavin Barraclough.
     4
     5        JSON.stringify is much slower than Firefox on particular pathological input
     6        https://bugs.webkit.org/show_bug.cgi?id=44456
     7
     8        Make StringBuilder::reserveCapacity reserve additional space so we don't end up
     9        repeatedly copying the entire result string.
     10
     11        * runtime/StringBuilder.h:
     12        (JSC::StringBuilder::append):
     13        (JSC::StringBuilder::reserveCapacity):
     14
    1152010-08-23  Jian Li  <jianli@chromium.org>
    216
  • trunk/JavaScriptCore/runtime/StringBuilder.h

    r65177 r65834  
    4545    void append(const char* str, size_t len)
    4646    {
    47         buffer.reserveCapacity(buffer.size() + len);
     47        reserveCapacity(buffer.size() + len);
    4848        for (size_t i = 0; i < len; i++)
    4949            buffer.append(static_cast<unsigned char>(str[i]));
     
    6161
    6262    bool isEmpty() { return buffer.isEmpty(); }
    63     void reserveCapacity(size_t newCapacity) { buffer.reserveCapacity(newCapacity); }
     63    void reserveCapacity(size_t newCapacity)
     64    {
     65        if (newCapacity < buffer.capacity())
     66            return;
     67        buffer.reserveCapacity(std::max(newCapacity, buffer.capacity() + buffer.capacity() / 4 + 1));
     68    }
    6469    void resize(size_t size) { buffer.resize(size); }
    6570    size_t size() const { return buffer.size(); }
Note: See TracChangeset for help on using the changeset viewer.