Open
Bug 1365361
Opened 8 years ago
Updated 2 years ago
[meta] Baseline: Optimize intrinsics used in self-hosted functions
Categories
(Core :: JavaScript Engine: JIT, enhancement, P3)
Core
JavaScript Engine: JIT
Tracking
()
NEW
People
(Reporter: djvj, Unassigned)
References
(Depends on 3 open bugs, Blocks 2 open bugs)
Details
(Keywords: meta, perf)
Attachments
(2 files)
After using rdtsc to measure time spent in intrinsics, and running the results against speedometer, I came up with a total measurement for time-spent in various intrinsics across the benchmark.
I ran it on speedometer, and once on a general browsing session that involved visiting gmail, gdocs, twitter frontpage, twitter search, cnn frontpage and article, amazon.com frontpage and "deals" page, reddit front page and articles.
I'll just paste the top 20 intrinsics, in terms of time-spent, for each case:
Speedometer:
std_Math_min => 28518554 ticks (count=413138)
RegExpInstanceOptimizable => 31105700 ticks (count=418403)
std_Math_max => 33540817 ticks (count=395139)
IsArray => 34312855 ticks (count=330131)
ToString => 36136290 ticks (count=912097)
StringReplaceString => 38208127 ticks (count=28218)
ToInteger => 44851095 ticks (count=535956)
IsPackedArray => 45654528 ticks (count=1414262)
GetElemBaseForLambda => 46164058 ticks (count=192145)
SubstringKernel => 61161206 ticks (count=270412)
RegExpGetSubstitution => 102270993 ticks (count=60778)
RegExpSearcher => 205811871 ticks (count=85808)
RegExpTester => 306156740 ticks (count=131025)
StringSplitStringLimit => 494954420 ticks (count=169360)
std_Array => 539239036 ticks (count=202579)
regexp_clone => 566546133 ticks (count=343155)
_FinishBoundFunctionInit => 1155262166 ticks (count=2322935)
_IsConstructing => 1271157593 ticks (count=2453737)
StringSplitString => 1538477812 ticks (count=788446)
RegExpMatcher => 2036433481 ticks (count=414165)
General browsing:
TypedArrayBuffer => 32183411 ticks (count=71061)
std_Set_iterator => 32347514 ticks (count=4579)
ToInteger => 37726105 ticks (count=439636)
GetElemBaseForLambda => 39114952 ticks (count=47771)
RegExpGetSubstitution => 40522762 ticks (count=18382)
intl_availableCalendars => 47658905 ticks (count=2)
std_Array_unshift => 55967512 ticks (count=1704)
NewArrayIterator => 60243392 ticks (count=44271)
intl_availableCollations => 61644663 ticks (count=8)
SubstringKernel => 76173240 ticks (count=199479)
_IsConstructing => 271923201 ticks (count=175464)
regexp_clone => 346393543 ticks (count=211026)
RegExpSearcher => 376314821 ticks (count=85419)
std_Array => 479490605 ticks (count=121695)
StringSplitString => 719726742 ticks (count=140479)
RegExpTester => 817476769 ticks (count=98545)
_FinishBoundFunctionInit => 874447924 ticks (count=90540)
RegExpMatcher => 2157427068 ticks (count=342273)
std_Math_max => 78983211736 ticks (count=410267)
std_Math_min => 139792616267 ticks (count=366073)
Reporter | ||
Comment 1•8 years ago
|
||
Results for speedometer run.
Reporter | ||
Comment 2•8 years ago
|
||
Results for general browsing run.
Reporter | ||
Comment 3•8 years ago
|
||
The general browsing result has a bad output for ToString, due to bad data cleanup in my script. Actual line should be:
ToString => 57046500 ticks (count=650918)
Comment 4•8 years ago
|
||
As mentioned on IRC, we could probably use |if (new.target)| now instead of |if (_IsConstructing())|. Worth measuring.
The call IC is the most complicated Baseline IC at this point. It would be nice to convert it to CacheIR - after that optimizing specific natives/intrinsics could be done with very little extra work. I can work on that in a few weeks if we think it's useful.
Reporter | ||
Comment 5•8 years ago
|
||
Till noted that the numbers for min/max seem really off. There might be outliers in the data caused by context switches in the middle of the function. Reminder to modify analysis script to throw out outliers before proceeding.
Reporter | ||
Comment 6•8 years ago
|
||
After updating the measurement patch to also measure timings for Array and String builtins (both C++-native and self-hosted), and updating the analysis script to throw out outliers (bug 1357180), here are new numbers for speedometer (I've not included functions with a total tick count of <100MM).
array_shift => ticks=102220982 count=77806
std_Array_slice => ticks=106317754 count=4254
StringReplaceString => ticks=110791304 count=82614
std_Function_apply => ticks=117073692 count=4707
GetElemBaseForLambda => ticks=124137568 count=1075279
array_pop => ticks=160722276 count=140350
String_slice => ticks=176774870 count=84595
String_substring => ticks=193600968 count=75892
String_substr => ticks=229778575 count=76086
RegExpSearcher => ticks=230758406 count=90718
array_isArray => ticks=272407559 count=8885200
ArrayValues => ticks=281930820 count=74746
str_indexOf => ticks=345024737 count=1488149
RegExpGetSubstitution => ticks=347971536 count=193384
str_toLowerCase => ticks=357953923 count=1277959
RegExpTester => ticks=365266413 count=207379
array_slice => ticks=582474382 count=165662
std_Array => ticks=742882733 count=279016
StringSplitString => ticks=758041193 count=153176
array_sort => ticks=791836175 count=38533
_IsConstructing => ticks=806360192 count=1108003
_FinishBoundFunctionInit => ticks=911459879 count=2068292
array_join => ticks=1003951216 count=133046
std_Object_propertyIsEnumerable => ticks=1168704086 count=10379632
array_indexOf => ticks=1179345302 count=532043
regexp_clone => ticks=1191878032 count=1272803
String_split => ticks=1427541939 count=157076
OwnPropertyKeys => ticks=1978027088 count=2205082
RegExpMatcher => ticks=2802172819 count=1207792
array_push => ticks=3461368102 count=3132916
Reporter | ||
Comment 7•8 years ago
|
||
Numbers from general browsing. This browsing session lasted a while, across a number of top sites (gmail, google, youtube, linkedin, facebook, twitter, cnn, reddit).
Only including the numbers for ticks >100MM.
std_Set_iterator => ticks=110725296 count=17862
std_Object_propertyIsEnumerable => ticks=112682723 count=263010
array_shift => ticks=125786592 count=70598
std_Function_apply => ticks=145469240 count=8750
String_slice => ticks=146129924 count=103430
str_toLowerCase => ticks=161173426 count=285030
array_splice => ticks=169108842 count=36109
String_substring => ticks=183796233 count=89195
String_substr => ticks=183904593 count=147892
str_indexOf => ticks=198504070 count=587945
std_Array_slice => ticks=222747012 count=12678
RegExpGetSubstitution => ticks=242745744 count=132726
OwnPropertyKeys => ticks=314028362 count=74700
ArrayValues => ticks=333697458 count=93216
array_join => ticks=344194601 count=154238
_IsConstructing => ticks=378989490 count=229550
array_indexOf => ticks=410826994 count=496983
RegExpSearcher => ticks=444617019 count=234626
array_sort => ticks=606447899 count=39295
array_unshift => ticks=611621356 count=161320
regexp_clone => ticks=612977614 count=370586
RegExpTester => ticks=732315111 count=117129
std_Array => ticks=884810658 count=234193
_FinishBoundFunctionInit => ticks=962056303 count=195800
array_slice => ticks=1120530487 count=461899
StringSplitString => ticks=1139177620 count=247124
array_push => ticks=1563841031 count=1405280
RegExpMatcher => ticks=2153891265 count=480151
String_split => ticks=2357659278 count=272309
Reporter | ||
Updated•8 years ago
|
Whiteboard: [qf]
Updated•8 years ago
|
Blocks: Speedometer_V2
Whiteboard: [qf] → [qf:p1]
Reporter | ||
Comment 8•7 years ago
|
||
New numbers on builtins after StringSplit and ArrayPush optimizations have been run:
Once again, please remember not to compare numbers between different runs. The right way to look at these numbers is to compare them to a "benchmark" function's tick count in the same run. We compare those ratios between different runs to look at relative speedups.
Under that approach, in Speedometer we are gaining about 80% on time spent in StringSplitString, and 34% on time spent in ArrayPush.
Here are the new report summaries for most time spent in builtins for Speedometer and General Browsing. I reversed the ordering from last time so most-time-spent items are at the top. Using the same cutoff of 10M ticks.
Speedometer:
array_join => ticks=19352580768 count=569279
RegExpMatcher => ticks=3205670410 count=484666
array_push => ticks=2681080704 count=3832802
std_Array => ticks=2575203136 count=1352807
array_slice => ticks=2523553088 count=1340680
array_indexOf => ticks=3358988002 count=551564
String_split => ticks=5032030848 count=147866
_IsConstructing => ticks=1018052960 count=1172548
array_sort => ticks=826795328 count=36777
str_indexOf => ticks=582414622 count=1785576
RegExpGetSubstitution => ticks=616876800 count=205655
str_toLowerCase => ticks=455484710 count=1870669
RegExpTester => ticks=480780768 count=426712
RegExpSearcher => ticks=1341955072 count=125226
ArrayValues => ticks=4194592338 count=40117
StringSplitString => ticks=306969696 count=67727
String_slice => ticks=11685939682 count=233225
array_pop => ticks=208414240 count=149748
String_substring => ticks=215179841 count=81851
GetElemBaseForLambda => ticks=199046364 count=1185811
std_Function_apply => ticks=184088960 count=5196
std_Array_slice => ticks=192658272 count=4589
_FinishBoundFunctionInit => ticks=176931424 count=118368
std_Array_unshift => ticks=140123424 count=3196
String_substr => ticks=136596640 count=52571
IsPackedArray => ticks=118330662 count=2508664
UnsafeGetInt32FromReservedSlot => ticks=99324537 count=1531467
ToObject => ticks=95117093 count=2510389
str_trim => ticks=95450108 count=842208
array_splice => ticks=87784192 count=27187
SubstringKernel => ticks=88307449 count=266676
StringReplaceString => ticks=86056992 count=62759
array_shift => ticks=80963552 count=54789
std_Math_min => ticks=80229890 count=803188
std_Math_max => ticks=78993198 count=774565
std_Reflect_getPrototypeOf => ticks=72150963 count=1519598
NewArrayIterator => ticks=76265942 count=40419
ToString => ticks=69363327 count=1347470
IsCallable => ticks=67435449 count=1150638
array_unshift => ticks=59193056 count=18150
array_isArray => ticks=57246768 count=994075
IsObject => ticks=49239181 count=1253637
std_Set_iterator => ticks=48248480 count=3102
ToInteger => ticks=44689052 count=758013
str_toString => ticks=44261369 count=213097
RegExpInstanceOptimizable => ticks=43805627 count=465875
IsRegExpObject => ticks=39202109 count=1030030
str_startsWith => ticks=34570080 count=73920
IsArray => ticks=30569062 count=192068
str_toUpperCase => ticks=30462912 count=65158
RegExpPrototypeOptimizable => ticks=20968322 count=159469
str_charAt => ticks=20551068 count=86571
std_Map_iterator => ticks=20766112 count=13392
String_localeCompare => ticks=17968608 count=1
UnsafeSetReservedSlot => ticks=17876455 count=147121
intl_CompareStrings => ticks=17483232 count=1
GetFirstDollarIndex => ticks=16500614 count=115185
IsConstructor => ticks=15801899 count=104103
array_includes => ticks=27502752 count=839
IsWrappedArrayConstructor => ticks=12548376 count=97388
str_endsWith => ticks=11584704 count=26405
UnsafeGetStringFromReservedSlot => ticks=10775487 count=269314
IsPossiblyWrappedTypedArray => ticks=10614453 count=93969
General Browsing:
String_split => ticks=663516512 count=69659
RegExpMatcher => ticks=1064411262 count=155731
array_push => ticks=404477376 count=532077
RegExpSearcher => ticks=383880025 count=110920
_FinishBoundFunctionInit => ticks=358290528 count=31550
array_slice => ticks=344820256 count=118802
RegExpTester => ticks=270172864 count=65736
array_sort => ticks=381719936 count=10163
std_Array => ticks=221480544 count=65479
ArrayValues => ticks=195148171 count=30119
_IsConstructing => ticks=175242432 count=125953
StringSplitString => ticks=163423456 count=44663
array_indexOf => ticks=157964612 count=182115
str_indexOf => ticks=124445984 count=254837
array_unshift => ticks=111931264 count=41741
array_join => ticks=122935552 count=36264
String_slice => ticks=113649667 count=172508
std_Function_apply => ticks=750153536 count=3517
array_splice => ticks=72989600 count=13028
String_substr => ticks=66333440 count=24983
str_toLowerCase => ticks=62616640 count=111437
array_shift => ticks=61394624 count=34002
array_pop => ticks=58621216 count=33596
String_substring => ticks=70482048 count=19195
std_Set_iterator => ticks=53232096 count=4738
NewArrayIterator => ticks=55698846 count=30408
str_startsWith => ticks=40516864 count=83127
RegExpGetSubstitution => ticks=48959232 count=22120
ToString => ticks=43755419 count=361958
TypedArrayBuffer => ticks=38244721 count=101789
UnsafeGetInt32FromReservedSlot => ticks=32083248 count=476532
SubstringKernel => ticks=42634824 count=84356
IsCallable => ticks=26072953 count=365345
std_Math_max => ticks=24845374 count=178627
str_trim => ticks=30686177 count=35442
std_Math_min => ticks=22148391 count=186798
std_Array_slice => ticks=33065952 count=1249
std_Array_unshift => ticks=22054976 count=496
std_Map_iterator => ticks=22780640 count=13982
str_endsWith => ticks=17673440 count=39705
ToInteger => ticks=17197309 count=229402
IsObject => ticks=16766629 count=359039
RegExpInstanceOptimizable => ticks=15256584 count=171238
IsRegExpObject => ticks=13813555 count=274547
GetElemBaseForLambda => ticks=18855884 count=25385
RegExpPrototypeOptimizable => ticks=11587099 count=57723
array_includes => ticks=43144032 count=779
UnsafeSetReservedSlot => ticks=10363473 count=95875
Reporter | ||
Comment 9•7 years ago
|
||
Just needinfo-ing you as a ping to note that the new measurements you asked for in SF are above.
Flags: needinfo?(andrebargull)
Reporter | ||
Comment 10•7 years ago
|
||
Changing this to [qf:meta] because this is not a perf bug, mostly tracking umbrella bug for identifying specific built-ins to optimize, which will be tracked as dependents of this bug.
Whiteboard: [qf:p1] → [qf:meta]
Comment 11•7 years ago
|
||
(In reply to Kannan Vijayan [:djvj] from comment #9)
> Just needinfo-ing you as a ping to note that the new measurements you asked
> for in SF are above.
Great, thanks! I've already found a few things for further optimizations. :-D
Flags: needinfo?(andrebargull)
Reporter | ||
Comment 12•7 years ago
|
||
Ugh, so the previous numbers I posted were not "cleaned up" to remove far outliers (chose the wrong dataset to put up).
Here's the cleaned up data. array_join is still at the top.
Speedometer:
array_join ticks=17611970528 count=567655
array_push ticks=3014251328 count=4677882
std_Array ticks=2549463008 count=1346281
array_slice ticks=2405925600 count=1343465
RegExpMatcher ticks=1520377047 count=466415
array_indexOf ticks=1091100002 count=551296
String_split ticks=992710144 count=142713
array_sort ticks=943137376 count=119083
_IsConstructing ticks=866099072 count=1087945
str_indexOf ticks=517247230 count=1578903
RegExpGetSubstitution ticks=506158368 count=206485
str_toLowerCase ticks=466028385 count=1974392
RegExpSearcher ticks=342306400 count=127900
RegExpTester ticks=288144544 count=175792
StringSplitString ticks=275228544 count=66369
String_substring ticks=257182945 count=266371
String_substr ticks=214265665 count=871272
GetElemBaseForLambda ticks=179544873 count=1187459
_FinishBoundFunctionInit ticks=175390656 count=115359
array_reverse ticks=174943744 count=102111
String_slice ticks=144205830 count=84601
IsPackedArray ticks=129565917 count=2497151
array_pop ticks=128714656 count=144792
ToObject ticks=100937144 count=2481294
StringReplaceString ticks=84933632 count=62062
array_splice ticks=81222752 count=28218
SubstringKernel ticks=80571792 count=268125
UnsafeGetInt32FromReservedSlot ticks=76111783 count=1198404
std_Reflect_getPrototypeOf ticks=74895548 count=1520341
IsCallable ticks=73455793 count=1129656
array_shift ticks=73016128 count=62501
ToString ticks=67189105 count=1103441
std_Math_max ticks=61439981 count=486319
array_isArray ticks=59274974 count=1062882
std_Math_min ticks=56162285 count=504294
str_trim ticks=51512097 count=77739
array_unshift ticks=44711936 count=16298
str_toString ticks=43479848 count=208809
IsObject ticks=41917650 count=951519
RegExpInstanceOptimizable ticks=38818492 count=451367
ToInteger ticks=35845481 count=465666
IsRegExpObject ticks=31781036 count=761082
ArrayValues ticks=29935552 count=6072
str_toUpperCase ticks=29459392 count=65134
IsArray ticks=23635834 count=184707
std_Function_apply ticks=21491936 count=1944
RegExpPrototypeOptimizable ticks=20985388 count=164479
str_charAt ticks=16285578 count=84045
GetFirstDollarIndex ticks=16039089 count=120141
IsConstructor ticks=14874254 count=98135
UnsafeGetStringFromReservedSlot ticks=10804405 count=247027
Comment 13•7 years ago
|
||
(In reply to Kannan Vijayan [:djvj] from comment #12)
> Here's the cleaned up data. array_join is still at the top.
>
> Speedometer:
>
> array_join ticks=17611970528 count=567655
FWIW I think most of this is the Ember case where we spend time under stringifying objects. Bug 1384562 should help there.
Updated•7 years ago
|
Priority: -- → P3
Updated•3 years ago
|
Summary: Baseline: Optimize intrinsics used in self-hosted functions → [meta] Baseline: Optimize intrinsics used in self-hosted functions
Updated•3 years ago
|
Performance Impact: --- → ?
Whiteboard: [qf:meta]
Updated•3 years ago
|
Performance Impact: ? → ---
Updated•2 years ago
|
Severity: normal → S3
You need to log in
before you can comment on or make changes to this bug.
Description
•