Changeset 2736 in webkit


Ignore:
Timestamp:
Nov 18, 2002, 1:55:23 PM (23 years ago)
Author:
darin
Message:
  • fix worst speed problems on the sort page of the iBench JavaScript test

Sped up JavaScript iBench by 70%, the sort page by 88%.

  • kjs/array_object.h: Add array-specific sort functions.
  • kjs/array_object.cpp: (compareByStringForQSort): Added. (ArrayInstanceImp::sort): Added. (compareWithCompareFunctionForQSort): Added. (ArrayProtoFuncImp::call): Use ArrayInstanceImp::sort if the object being sorted is actually an array.
  • kjs/object.h: Add argumentsPropertyName.
  • kjs/object.cpp: Add argumentsPropertyName.
  • kjs/function.cpp: (FunctionImp::FunctionImp): Use argumentsPropertyName to avoid making a UString. (FunctionImp::call): Ditto. (ActivationImp::ActivationImp): Ditto.
  • kjs/function_object.cpp: (FunctionObjectImp::construct): Ditto.
  • kjs/ustring.h: Added compare function for -1/0/+1 comparison.
  • kjs/ustring.cpp: (KJS::compare): Added.
Location:
trunk/JavaScriptCore
Files:
11 edited

Legend:

Unmodified
Added
Removed
  • trunk/JavaScriptCore/ChangeLog

    r2735 r2736  
     12002-11-18  Darin Adler  <[email protected]>
     2
     3        - fix worst speed problems on the sort page of the iBench JavaScript test
     4
     5        Sped up JavaScript iBench by 70%, the sort page by 88%.
     6
     7        * kjs/array_object.h: Add array-specific sort functions.
     8        * kjs/array_object.cpp:
     9        (compareByStringForQSort): Added.
     10        (ArrayInstanceImp::sort): Added.
     11        (compareWithCompareFunctionForQSort): Added.
     12        (ArrayProtoFuncImp::call): Use ArrayInstanceImp::sort if the object being
     13        sorted is actually an array.
     14
     15        * kjs/object.h: Add argumentsPropertyName.
     16        * kjs/object.cpp: Add argumentsPropertyName.
     17        * kjs/function.cpp:
     18        (FunctionImp::FunctionImp): Use argumentsPropertyName to avoid making a UString.
     19        (FunctionImp::call): Ditto.
     20        (ActivationImp::ActivationImp): Ditto.
     21        * kjs/function_object.cpp: (FunctionObjectImp::construct): Ditto.
     22
     23        * kjs/ustring.h: Added compare function for -1/0/+1 comparison.
     24        * kjs/ustring.cpp: (KJS::compare): Added.
     25
    1262002-11-18  Maciej Stachowiak  <[email protected]>
    227
  • trunk/JavaScriptCore/ChangeLog-2002-12-03

    r2735 r2736  
     12002-11-18  Darin Adler  <[email protected]>
     2
     3        - fix worst speed problems on the sort page of the iBench JavaScript test
     4
     5        Sped up JavaScript iBench by 70%, the sort page by 88%.
     6
     7        * kjs/array_object.h: Add array-specific sort functions.
     8        * kjs/array_object.cpp:
     9        (compareByStringForQSort): Added.
     10        (ArrayInstanceImp::sort): Added.
     11        (compareWithCompareFunctionForQSort): Added.
     12        (ArrayProtoFuncImp::call): Use ArrayInstanceImp::sort if the object being
     13        sorted is actually an array.
     14
     15        * kjs/object.h: Add argumentsPropertyName.
     16        * kjs/object.cpp: Add argumentsPropertyName.
     17        * kjs/function.cpp:
     18        (FunctionImp::FunctionImp): Use argumentsPropertyName to avoid making a UString.
     19        (FunctionImp::call): Ditto.
     20        (ActivationImp::ActivationImp): Ditto.
     21        * kjs/function_object.cpp: (FunctionObjectImp::construct): Ditto.
     22
     23        * kjs/ustring.h: Added compare function for -1/0/+1 comparison.
     24        * kjs/ustring.cpp: (KJS::compare): Added.
     25
    1262002-11-18  Maciej Stachowiak  <[email protected]>
    227
  • trunk/JavaScriptCore/ChangeLog-2003-10-25

    r2735 r2736  
     12002-11-18  Darin Adler  <[email protected]>
     2
     3        - fix worst speed problems on the sort page of the iBench JavaScript test
     4
     5        Sped up JavaScript iBench by 70%, the sort page by 88%.
     6
     7        * kjs/array_object.h: Add array-specific sort functions.
     8        * kjs/array_object.cpp:
     9        (compareByStringForQSort): Added.
     10        (ArrayInstanceImp::sort): Added.
     11        (compareWithCompareFunctionForQSort): Added.
     12        (ArrayProtoFuncImp::call): Use ArrayInstanceImp::sort if the object being
     13        sorted is actually an array.
     14
     15        * kjs/object.h: Add argumentsPropertyName.
     16        * kjs/object.cpp: Add argumentsPropertyName.
     17        * kjs/function.cpp:
     18        (FunctionImp::FunctionImp): Use argumentsPropertyName to avoid making a UString.
     19        (FunctionImp::call): Ditto.
     20        (ActivationImp::ActivationImp): Ditto.
     21        * kjs/function_object.cpp: (FunctionObjectImp::construct): Ditto.
     22
     23        * kjs/ustring.h: Added compare function for -1/0/+1 comparison.
     24        * kjs/ustring.cpp: (KJS::compare): Added.
     25
    1262002-11-18  Maciej Stachowiak  <[email protected]>
    227
  • trunk/JavaScriptCore/kjs/array_object.cpp

    r2475 r2736  
    191191      imp->mark();
    192192  }
     193}
     194
     195static ExecState *execForCompareByStringForQSort;
     196
     197static int compareByStringForQSort(const void *a, const void *b)
     198{
     199    ExecState *exec = execForCompareByStringForQSort;
     200    return compare(Value(*(ValueImp **)a).toString(exec), Value(*(ValueImp **)b).toString(exec));
     201}
     202
     203void ArrayInstanceImp::sort(ExecState *exec)
     204{
     205    execForCompareByStringForQSort = exec;
     206    qsort(storage, length, sizeof(ValueImp *), compareByStringForQSort);
     207    execForCompareByStringForQSort = 0;
     208}
     209
     210struct CompareWithCompareFunctionArguments {
     211    CompareWithCompareFunctionArguments(ExecState *e, ObjectImp *cf)
     212        : exec(e)
     213        , compareFunction(cf)
     214        , globalObject(e->interpreter()->globalObject())
     215    { }
     216
     217    ExecState *exec;
     218    ObjectImp *compareFunction;
     219    List arguments;
     220    Object globalObject;
     221};
     222
     223static CompareWithCompareFunctionArguments *compareWithCompareFunctionArguments;
     224
     225static int compareWithCompareFunctionForQSort(const void *a, const void *b)
     226{
     227    CompareWithCompareFunctionArguments *args = compareWithCompareFunctionArguments;
     228   
     229    args->arguments.clear();
     230    args->arguments.append(Value(*(ValueImp **)a));
     231    args->arguments.append(Value(*(ValueImp **)b));
     232    return args->compareFunction->call(args->exec, args->globalObject, args->arguments)
     233        .toInt32(args->exec);
     234}
     235
     236void ArrayInstanceImp::sort(ExecState *exec, Object &compareFunction)
     237{
     238    CompareWithCompareFunctionArguments args(exec, compareFunction.imp());
     239    compareWithCompareFunctionArguments = &args;
     240    qsort(storage, length, sizeof(ValueImp *), compareWithCompareFunctionForQSort);
     241    compareWithCompareFunctionArguments = 0;
    193242}
    194243
     
    425474          useSortFunction = false;
    426475      }
     476   
     477    if (thisObj.imp()->classInfo() == &ArrayInstanceImp::info) {
     478      if (useSortFunction)
     479        ((ArrayInstanceImp *)thisObj.imp())->sort(exec, sortFunction);
     480      else
     481        ((ArrayInstanceImp *)thisObj.imp())->sort(exec);
     482      result = thisObj;
     483      break;
     484    }
    427485
    428486    if (length == 0) {
    429487      thisObj.put(exec, lengthPropertyName, Number(0), DontEnum | DontDelete);
    430       result = Undefined();
     488      result = thisObj;
    431489      break;
    432490    }
  • trunk/JavaScriptCore/kjs/array_object.h

    r1821 r2736  
    5050    unsigned getLength() const { return length; }
    5151   
     52    void sort(ExecState *exec);
     53    void sort(ExecState *exec, Object &compareFunction);
     54   
    5255  private:
    5356    void setLength(unsigned newLength);
  • trunk/JavaScriptCore/kjs/function.cpp

    r2249 r2736  
    6060  Value protect(this);
    6161  //fprintf(stderr,"FunctionImp::FunctionImp this=%p\n");
    62   put(exec,"arguments",Null(),ReadOnly|DontDelete|DontEnum);
     62  put(exec,argumentsPropertyName,Null(),ReadOnly|DontDelete|DontEnum);
    6363}
    6464
     
    109109  // previous arguments object.
    110110  // Note: this does not appear to be part of the spec
    111   Value oldArgs = get(&newExec, "arguments");
     111  Value oldArgs = get(&newExec, argumentsPropertyName);
    112112
    113113  if (codeType() == FunctionCode) {
    114114    assert(ctx.activationObject().inherits(&ActivationImp::info));
    115115    Object argsObj = static_cast<ActivationImp*>(ctx.activationObject().imp())->argumentsObject();
    116     put(&newExec, "arguments", argsObj, DontDelete|DontEnum|ReadOnly);
     116    put(&newExec, argumentsPropertyName, argsObj, DontDelete|DontEnum|ReadOnly);
    117117  }
    118118
     
    128128    exec->setException(newExec.exception());
    129129  if (codeType() == FunctionCode)
    130     put(&newExec, "arguments", oldArgs, DontDelete|DontEnum|ReadOnly);
     130    put(&newExec, argumentsPropertyName, oldArgs, DontDelete|DontEnum|ReadOnly);
    131131
    132132#ifdef KJS_VERBOSE
     
    309309  Value protect(this);
    310310  arguments = new ArgumentsImp(exec,f, args);
    311   put(exec, "arguments", Object(arguments), Internal|DontDelete);
     311  put(exec, argumentsPropertyName, Object(arguments), Internal|DontDelete);
    312312}
    313313
  • trunk/JavaScriptCore/kjs/function_object.cpp

    r1799 r2736  
    284284                Object(fimp), DontEnum|DontDelete|ReadOnly);
    285285  fimp->put(exec,prototypePropertyName,prototype,DontEnum|DontDelete|ReadOnly);
    286   fimp->put(exec,"arguments",Null(),DontEnum|DontDelete|ReadOnly);
     286  fimp->put(exec,argumentsPropertyName,Null(),DontEnum|DontDelete|ReadOnly);
    287287  return ret;
    288288}
  • trunk/JavaScriptCore/kjs/object.cpp

    r2535 r2736  
    4242namespace KJS {
    4343
     44extern const UString argumentsPropertyName("arguments");
    4445extern const UString lengthPropertyName("length");
    4546extern const UString prototypePropertyName("prototype");
  • trunk/JavaScriptCore/kjs/object.h

    r2184 r2736  
    706706    { imp()->setInternalValue(v); }
    707707
     708  extern const UString argumentsPropertyName;
    708709  extern const UString lengthPropertyName;
    709710  extern const UString prototypePropertyName;
  • trunk/JavaScriptCore/kjs/ustring.cpp

    r2304 r2736  
    643643  return (l1 < l2);
    644644}
     645
     646int KJS::compare(const UString& s1, const UString& s2)
     647{
     648  const int l1 = s1.size();
     649  const int l2 = s2.size();
     650  const int lmin = l1 < l2 ? l1 : l2;
     651  const UChar *c1 = s1.data();
     652  const UChar *c2 = s2.data();
     653  int l = 0;
     654  while (l < lmin && *c1 == *c2) {
     655    c1++;
     656    c2++;
     657    l++;
     658  }
     659  if (l < lmin)
     660    return (c1->unicode() > c2->unicode()) ? 1 : -1;
     661
     662  if (l1 == l2) {
     663    return 0;
     664  }
     665  return (l1 < l2) ? 1 : -1;
     666}
  • trunk/JavaScriptCore/kjs/ustring.h

    r2483 r2736  
    431431    return UString(s1, s2);
    432432  }
     433 
     434  int compare(const UString &, const UString &);
    433435
    434436}; // namespace
Note: See TracChangeset for help on using the changeset viewer.