Changeset 270665 in webkit


Ignore:
Timestamp:
Dec 10, 2020 8:20:19 PM (3 years ago)
Author:
Tadeu Zagallo
Message:

Removing unnecessary locking from JSValue API functions
https://bugs.webkit.org/show_bug.cgi?id=219723

Reviewed by Filip Pizlo.

PerformanceTests:

Print an error message when benchmarks fail to run and add option to change
the configuration used to build the benchmarks.

  • APIBench/api-bench:

Source/JavaScriptCore:

Remove the unnecessary locking from the JSValueIs* and JSValueMake* API functions
that only work on primitives. Also remove the unnecessary method dispatching and
call from the -[JSValue is*] methods.

This improves the APIBench score by another ~8% since these are such common operations.
Here are the results: (Baseline includes https://bugs.webkit.org/show_bug.cgi?id=219663)

CURRENT_API: Baseline Change


RichardsMostlyC: 74ms 60ms
RichardsMostlyObjC: 304ms 300ms
RichardsMostlySwift: 305ms 293ms
RichardsSomeC: 97ms 77ms
RichardsSomeObjC: 158ms 159ms
RichardsSomeSwift: 202ms 198ms

UPCOMING_API: Baseline Change


RichardsMostlyC: 23ms 19ms
RichardsMostlyObjC: 282ms 282ms
RichardsMostlySwift: 280ms 282ms
RichardsSomeC: 95ms 76ms
RichardsSomeObjC: 157ms 156ms
RichardsSomeSwift: 202ms 197ms


Score: 33.6404 36.4006

  • API/APICast.h:

(toRef):

  • API/JSValue.mm:

(-[JSValue isUndefined]):
(-[JSValue isNull]):
(-[JSValue isBoolean]):
(-[JSValue isNumber]):
(-[JSValue isString]):
(-[JSValue isObject]):
(-[JSValue isSymbol]):

  • API/JSValueRef.cpp:

(JSValueGetType):
(JSValueIsUndefined):
(JSValueIsNull):
(JSValueIsBoolean):
(JSValueIsNumber):
(JSValueIsString):
(JSValueIsObject):
(JSValueIsSymbol):
(JSValueMakeUndefined):
(JSValueMakeNull):
(JSValueMakeBoolean):
(JSValueMakeNumber):

Location:
trunk
Files:
6 edited

Legend:

Unmodified
Added
Removed
  • trunk/PerformanceTests/APIBench/api-bench

    r270659 r270665  
    3838UPCOMING_API=()
    3939ARCHS=${ARCHS:-$(uname -m)}
     40CONFIGURATION=${CONFIGURATION:-Release}
    4041
    4142shouldBuild=true
     
    149150
    150151    log "Building $BENCHMARK_NAME... (FRAMEWORK_SEARCH_PATHS='$BUILD_DIRECTORY')"
    151     xcodebuild -project "$project" -target "$BENCHMARK_NAME" -configuration Release build "FRAMEWORK_SEARCH_PATHS='$BUILD_DIRECTORY'" "ARCHS='$ARCHS'"
     152    xcodebuild -project "$project" -target "$BENCHMARK_NAME" -configuration "$CONFIGURATION" build "FRAMEWORK_SEARCH_PATHS='$BUILD_DIRECTORY'" "ARCHS='$ARCHS'"
    152153}
    153154
     
    162163
    163164runNativeBenchmark() {
    164     pushd "build/Release" &> /dev/null
     165    pushd "build/$CONFIGURATION" &> /dev/null
    165166    "./$BENCHMARK_NAME"
     167    local exitCode=$?
     168    if [ $exitCode -ne 0 ]; then
     169        echo "Benchmark exited with an error: $PWD/$BENCHMARK_NAME exited with $exitCode" 1>&2
     170    fi
    166171    popd &> /dev/null
     172    return $exitCode
    167173}
    168174
     
    180186    local result
    181187    result=$(runBenchmarkIteration)
     188    if [ $? -ne 0 ]; then
     189        exit 1
     190    fi
    182191    RESULTS[$((BENCHMARK_ID * iterations + ITERATION))]=$result
    183192    log "Finished in ${result}ms"
  • trunk/PerformanceTests/ChangeLog

    r270659 r270665  
     12020-12-10  Tadeu Zagallo  <tzagallo@apple.com>
     2
     3        Removing unnecessary locking from JSValue API functions
     4        https://bugs.webkit.org/show_bug.cgi?id=219723
     5
     6        Reviewed by Filip Pizlo.
     7
     8        Print an error message when benchmarks fail to run and add option to change
     9        the configuration used to build the benchmarks.
     10
     11        * APIBench/api-bench:
     12
    1132020-12-10  Tadeu Zagallo  <tzagallo@apple.com>
    214
  • trunk/Source/JavaScriptCore/API/APICast.h

    r251425 r270665  
    8989}
    9090
     91#if CPU(ADDRESS64)
     92inline JSC::JSValue toJS(JSValueRef value)
     93{
     94    return bitwise_cast<JSC::JSValue>(value);
     95}
     96#endif
     97
    9198inline JSC::JSValue toJSForGC(JSC::JSGlobalObject* globalObject, JSValueRef v)
    9299{
     
    149156}
    150157
     158#if CPU(ADDRESS64)
     159inline JSValueRef toRef(JSC::JSValue v)
     160{
     161    return bitwise_cast<JSValueRef>(v);
     162}
     163#endif
     164
    151165inline JSObjectRef toRef(JSC::JSObject* o)
    152166{
  • trunk/Source/JavaScriptCore/API/JSValue.mm

    r260366 r270665  
    399399- (BOOL)isUndefined
    400400{
     401#if !CPU(ADDRESS64)
    401402    return JSValueIsUndefined([_context JSGlobalContextRef], m_value);
     403#else
     404    return toJS(m_value).isUndefined();
     405#endif
    402406}
    403407
    404408- (BOOL)isNull
    405409{
    406     return JSValueIsNull([_context JSGlobalContextRef], m_value);
     410#if !CPU(ADDRESS64)
     411    return JSValueIsUndefined([_context JSGlobalContextRef], m_value);
     412#else
     413    return toJS(m_value).isNull();
     414#endif
    407415}
    408416
    409417- (BOOL)isBoolean
    410418{
    411     return JSValueIsBoolean([_context JSGlobalContextRef], m_value);
     419#if !CPU(ADDRESS64)
     420    return JSValueIsUndefined([_context JSGlobalContextRef], m_value);
     421#else
     422    return toJS(m_value).isBoolean();
     423#endif
    412424}
    413425
    414426- (BOOL)isNumber
    415427{
    416     return JSValueIsNumber([_context JSGlobalContextRef], m_value);
     428#if !CPU(ADDRESS64)
     429    return JSValueIsUndefined([_context JSGlobalContextRef], m_value);
     430#else
     431    return toJS(m_value).isNumber();
     432#endif
    417433}
    418434
    419435- (BOOL)isString
    420436{
    421     return JSValueIsString([_context JSGlobalContextRef], m_value);
     437#if !CPU(ADDRESS64)
     438    return JSValueIsUndefined([_context JSGlobalContextRef], m_value);
     439#else
     440    return toJS(m_value).isString();
     441#endif
    422442}
    423443
    424444- (BOOL)isObject
    425445{
     446#if !CPU(ADDRESS64)
    426447    return JSValueIsObject([_context JSGlobalContextRef], m_value);
     448#else
     449    return toJS(m_value).isObject();
     450#endif
    427451}
    428452
    429453- (BOOL)isSymbol
    430454{
     455#if !CPU(ADDRESS64)
    431456    return JSValueIsSymbol([_context JSGlobalContextRef], m_value);
     457#else
     458    return toJS(m_value).isSymbol();
     459#endif
    432460}
    433461
  • trunk/Source/JavaScriptCore/API/JSValueRef.cpp

    r270659 r270665  
    5555        return kJSTypeUndefined;
    5656    }
    57     JSGlobalObject* globalObject = toJS(ctx);
    58     JSLockHolder locker(globalObject);
    59 
    60     JSValue jsValue = toJS(globalObject, value);
     57#if !CPU(ADDRESS64)
     58    JSGlobalObject* globalObject = toJS(ctx);
     59    JSLockHolder locker(globalObject);
     60    JSValue jsValue = toJS(globalObject, value);
     61#else
     62    JSValue jsValue = toJS(value);
     63#endif
    6164
    6265    if (jsValue.isUndefined())
     
    8285        return false;
    8386    }
    84     JSGlobalObject* globalObject = toJS(ctx);
    85     JSLockHolder locker(globalObject);
    86 
     87#if !CPU(ADDRESS64)
     88    JSGlobalObject* globalObject = toJS(ctx);
     89    JSLockHolder locker(globalObject);
    8790    return toJS(globalObject, value).isUndefined();
     91#else
     92    return toJS(value).isUndefined();
     93#endif
    8894}
    8995
     
    94100        return false;
    95101    }
    96     JSGlobalObject* globalObject = toJS(ctx);
    97     JSLockHolder locker(globalObject);
    98 
     102
     103#if !CPU(ADDRESS64)
     104    JSGlobalObject* globalObject = toJS(ctx);
     105    JSLockHolder locker(globalObject);
    99106    return toJS(globalObject, value).isNull();
     107#else
     108    return toJS(value).isNull();
     109#endif
    100110}
    101111
     
    106116        return false;
    107117    }
    108     JSGlobalObject* globalObject = toJS(ctx);
    109     JSLockHolder locker(globalObject);
    110 
     118#if !CPU(ADDRESS64)
     119    JSGlobalObject* globalObject = toJS(ctx);
     120    JSLockHolder locker(globalObject);
    111121    return toJS(globalObject, value).isBoolean();
     122#else
     123    return toJS(value).isBoolean();
     124#endif
    112125}
    113126
     
    118131        return false;
    119132    }
    120     JSGlobalObject* globalObject = toJS(ctx);
    121     JSLockHolder locker(globalObject);
    122 
     133#if !CPU(ADDRESS64)
     134    JSGlobalObject* globalObject = toJS(ctx);
     135    JSLockHolder locker(globalObject);
    123136    return toJS(globalObject, value).isNumber();
     137#else
     138    return toJS(value).isNumber();
     139#endif
    124140}
    125141
     
    130146        return false;
    131147    }
    132     JSGlobalObject* globalObject = toJS(ctx);
    133     JSLockHolder locker(globalObject);
    134 
     148#if !CPU(ADDRESS64)
     149    JSGlobalObject* globalObject = toJS(ctx);
     150    JSLockHolder locker(globalObject);
    135151    return toJS(globalObject, value).isString();
     152#else
     153    return toJS(value).isString();
     154#endif
    136155}
    137156
     
    142161        return false;
    143162    }
    144     JSGlobalObject* globalObject = toJS(ctx);
    145     JSLockHolder locker(globalObject);
    146 
     163#if !CPU(ADDRESS64)
     164    JSGlobalObject* globalObject = toJS(ctx);
     165    JSLockHolder locker(globalObject);
    147166    return toJS(globalObject, value).isObject();
     167#else
     168    return toJS(value).isObject();
     169#endif
    148170}
    149171
     
    154176        return false;
    155177    }
    156     JSGlobalObject* globalObject = toJS(ctx);
    157     JSLockHolder locker(globalObject);
    158 
     178#if !CPU(ADDRESS64)
     179    JSGlobalObject* globalObject = toJS(ctx);
     180    JSLockHolder locker(globalObject);
    159181    return toJS(globalObject, value).isSymbol();
     182#else
     183    return toJS(value).isSymbol();
     184#endif
    160185}
    161186
     
    278303        return nullptr;
    279304    }
    280     JSGlobalObject* globalObject = toJS(ctx);
    281     JSLockHolder locker(globalObject);
    282 
     305#if !CPU(ADDRESS64)
     306    JSGlobalObject* globalObject = toJS(ctx);
     307    JSLockHolder locker(globalObject);
    283308    return toRef(globalObject, jsUndefined());
     309#else
     310    return toRef(jsUndefined());
     311#endif
    284312}
    285313
     
    290318        return nullptr;
    291319    }
    292     JSGlobalObject* globalObject = toJS(ctx);
    293     JSLockHolder locker(globalObject);
    294 
     320#if !CPU(ADDRESS64)
     321    JSGlobalObject* globalObject = toJS(ctx);
     322    JSLockHolder locker(globalObject);
    295323    return toRef(globalObject, jsNull());
     324#else
     325    return toRef(jsNull());
     326#endif
    296327}
    297328
     
    302333        return nullptr;
    303334    }
    304     JSGlobalObject* globalObject = toJS(ctx);
    305     JSLockHolder locker(globalObject);
    306 
     335#if !CPU(ADDRESS64)
     336    JSGlobalObject* globalObject = toJS(ctx);
     337    JSLockHolder locker(globalObject);
    307338    return toRef(globalObject, jsBoolean(value));
     339#else
     340    return toRef(jsBoolean(value));
     341#endif
    308342}
    309343
     
    314348        return nullptr;
    315349    }
    316     JSGlobalObject* globalObject = toJS(ctx);
    317     JSLockHolder locker(globalObject);
    318 
     350#if !CPU(ADDRESS64)
     351    JSGlobalObject* globalObject = toJS(ctx);
     352    JSLockHolder locker(globalObject);
    319353    return toRef(globalObject, jsNumber(purifyNaN(value)));
     354#else
     355    return toRef(jsNumber(purifyNaN(value)));
     356#endif
    320357}
    321358
  • trunk/Source/JavaScriptCore/ChangeLog

    r270664 r270665  
     12020-12-10  Tadeu Zagallo  <tzagallo@apple.com>
     2
     3        Removing unnecessary locking from JSValue API functions
     4        https://bugs.webkit.org/show_bug.cgi?id=219723
     5
     6        Reviewed by Filip Pizlo.
     7
     8        Remove the unnecessary locking from the JSValueIs* and JSValueMake* API functions
     9        that only work on primitives. Also remove the unnecessary method dispatching and
     10        call from the -[JSValue is*] methods.
     11
     12        This improves the APIBench score by another ~8% since these are such common operations.
     13        Here are the results: (Baseline includes https://bugs.webkit.org/show_bug.cgi?id=219663)
     14
     15        CURRENT_API:        Baseline   Change
     16        ----------------------------------------
     17        RichardsMostlyC:      74ms      60ms
     18        RichardsMostlyObjC:  304ms     300ms
     19        RichardsMostlySwift: 305ms     293ms
     20        RichardsSomeC:        97ms      77ms
     21        RichardsSomeObjC:    158ms     159ms
     22        RichardsSomeSwift:   202ms     198ms
     23
     24        UPCOMING_API:       Baseline   Change
     25        ----------------------------------------
     26        RichardsMostlyC:      23ms      19ms
     27        RichardsMostlyObjC:  282ms     282ms
     28        RichardsMostlySwift: 280ms     282ms
     29        RichardsSomeC:        95ms      76ms
     30        RichardsSomeObjC:    157ms     156ms
     31        RichardsSomeSwift:   202ms     197ms
     32        ----------------------------------------
     33        Score:             33.6404   36.4006
     34
     35        * API/APICast.h:
     36        (toRef):
     37        * API/JSValue.mm:
     38        (-[JSValue isUndefined]):
     39        (-[JSValue isNull]):
     40        (-[JSValue isBoolean]):
     41        (-[JSValue isNumber]):
     42        (-[JSValue isString]):
     43        (-[JSValue isObject]):
     44        (-[JSValue isSymbol]):
     45        * API/JSValueRef.cpp:
     46        (JSValueGetType):
     47        (JSValueIsUndefined):
     48        (JSValueIsNull):
     49        (JSValueIsBoolean):
     50        (JSValueIsNumber):
     51        (JSValueIsString):
     52        (JSValueIsObject):
     53        (JSValueIsSymbol):
     54        (JSValueMakeUndefined):
     55        (JSValueMakeNull):
     56        (JSValueMakeBoolean):
     57        (JSValueMakeNumber):
     58
    1592020-12-10  Alexey Shvayka  <shvaikalesh@gmail.com>
    260
Note: See TracChangeset for help on using the changeset viewer.