Ignore:
Timestamp:
May 16, 2011, 9:08:18 PM (14 years ago)
Author:
[email protected]
Message:

2011-05-16 Geoffrey Garen <[email protected]>

Reviewed by Geoffrey Garen.

Global object initialization is expensive
https://bugs.webkit.org/show_bug.cgi?id=60933


Changed a bunch of globals to allocate their properties lazily, and changed
the global object to allocate a bunch of its globals lazily.


This reduces the footprint of a global object from 287 objects with 58
functions for 24K to 173 objects with 20 functions for 15K.

Large patch, but it's all mechanical.

  • create_hash_table: Added a special case for fromCharCode, since it uses a custom "thunk generator".
  • heap/Heap.cpp: (JSC::TypeCounter::operator()): Fixed a bug where the type counter would overcount objects that were owned through more than one mechanism because it was getting in the way of counting the results for this patch.
  • interpreter/CallFrame.h: (JSC::ExecState::arrayConstructorTable): (JSC::ExecState::arrayPrototypeTable): (JSC::ExecState::booleanPrototypeTable): (JSC::ExecState::dateConstructorTable): (JSC::ExecState::errorPrototypeTable): (JSC::ExecState::globalObjectTable): (JSC::ExecState::numberConstructorTable): (JSC::ExecState::numberPrototypeTable): (JSC::ExecState::objectPrototypeTable): (JSC::ExecState::regExpPrototypeTable): (JSC::ExecState::stringConstructorTable): Added new tables.
  • runtime/ArrayConstructor.cpp: (JSC::ArrayConstructor::ArrayConstructor): (JSC::ArrayConstructor::getOwnPropertySlot): (JSC::ArrayConstructor::getOwnPropertyDescriptor):
  • runtime/ArrayConstructor.h: (JSC::ArrayConstructor::createStructure):
  • runtime/ArrayPrototype.cpp: (JSC::ArrayPrototype::getOwnPropertySlot): (JSC::ArrayPrototype::getOwnPropertyDescriptor):
  • runtime/ArrayPrototype.h:
  • runtime/BooleanPrototype.cpp: (JSC::BooleanPrototype::BooleanPrototype): (JSC::BooleanPrototype::getOwnPropertySlot): (JSC::BooleanPrototype::getOwnPropertyDescriptor):
  • runtime/BooleanPrototype.h: (JSC::BooleanPrototype::createStructure):
  • runtime/DateConstructor.cpp: (JSC::DateConstructor::DateConstructor): (JSC::DateConstructor::getOwnPropertySlot): (JSC::DateConstructor::getOwnPropertyDescriptor):
  • runtime/DateConstructor.h: (JSC::DateConstructor::createStructure):
  • runtime/ErrorPrototype.cpp: (JSC::ErrorPrototype::ErrorPrototype): (JSC::ErrorPrototype::getOwnPropertySlot): (JSC::ErrorPrototype::getOwnPropertyDescriptor):
  • runtime/ErrorPrototype.h: (JSC::ErrorPrototype::createStructure): Standardized these objects to use static tables for function properties.
  • runtime/JSGlobalData.cpp: (JSC::JSGlobalData::JSGlobalData): (JSC::JSGlobalData::~JSGlobalData):
  • runtime/JSGlobalData.h: Added new tables.
  • runtime/JSGlobalObject.cpp: (JSC::JSGlobalObject::reset): (JSC::JSGlobalObject::addStaticGlobals): (JSC::JSGlobalObject::getOwnPropertySlot): (JSC::JSGlobalObject::getOwnPropertyDescriptor):
  • runtime/JSGlobalObject.h:
  • runtime/JSGlobalObjectFunctions.cpp:
  • runtime/JSGlobalObjectFunctions.h: Changed JSGlobalObject to use a static table for its global functions. This required uninlining some things to avoid a circular header dependency. However, those things probably shouldn't have been inlined in the first place.


Even more global object properties can be made lazy, but that requires
more in-depth changes.

  • runtime/MathObject.cpp:
  • runtime/NumberConstructor.cpp: (JSC::NumberConstructor::getOwnPropertySlot): (JSC::NumberConstructor::getOwnPropertyDescriptor):
  • runtime/NumberPrototype.cpp: (JSC::NumberPrototype::NumberPrototype): (JSC::NumberPrototype::getOwnPropertySlot): (JSC::NumberPrototype::getOwnPropertyDescriptor):
  • runtime/NumberPrototype.h: (JSC::NumberPrototype::createStructure):
  • runtime/ObjectPrototype.cpp: (JSC::ObjectPrototype::ObjectPrototype): (JSC::ObjectPrototype::put): (JSC::ObjectPrototype::getOwnPropertySlot): (JSC::ObjectPrototype::getOwnPropertyDescriptor):
  • runtime/ObjectPrototype.h: (JSC::ObjectPrototype::createStructure):
  • runtime/RegExpPrototype.cpp: (JSC::RegExpPrototype::RegExpPrototype): (JSC::RegExpPrototype::getOwnPropertySlot): (JSC::RegExpPrototype::getOwnPropertyDescriptor):
  • runtime/RegExpPrototype.h: (JSC::RegExpPrototype::createStructure):
  • runtime/StringConstructor.cpp: (JSC::StringConstructor::StringConstructor): (JSC::StringConstructor::getOwnPropertySlot): (JSC::StringConstructor::getOwnPropertyDescriptor):
  • runtime/StringConstructor.h: (JSC::StringConstructor::createStructure): Standardized these objects to use static tables for function properties.
File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/JavaScriptCore/DerivedSources.make

    r81739 r86653  
    3636.PHONY : all
    3737all : \
     38    ArrayConstructor.lut.h \
    3839    ArrayPrototype.lut.h \
     40    BooleanPrototype.lut.h \
     41    DateConstructor.lut.h \
    3942    DatePrototype.lut.h \
     43    ErrorPrototype.lut.h \
    4044    HeaderDetection.h \
    4145    JSONObject.lut.h \
    4246    JavaScriptCore.JSVALUE32_64.exp \
    4347    JavaScriptCore.JSVALUE64.exp \
     48    JSGlobalObject.lut.h \
    4449    Lexer.lut.h \
    4550    MathObject.lut.h \
    4651    NumberConstructor.lut.h \
     52    NumberPrototype.lut.h \
    4753    ObjectConstructor.lut.h \
     54    ObjectPrototype.lut.h \
    4855    RegExpConstructor.lut.h \
     56    RegExpPrototype.lut.h \
    4957    RegExpJitTables.h \
    5058    RegExpObject.lut.h \
     59    StringConstructor.lut.h \
    5160    StringPrototype.lut.h \
    5261    docs/bytecode.html \
Note: See TracChangeset for help on using the changeset viewer.