Baseline: Optimize intrinsics used in self-hosted functions




JavaScript Engine: JIT
3 months ago
2 days ago


(Reporter: djvj, Unassigned)


(Depends on: 5 bugs, Blocks: 2 bugs)

Firefox Tracking Flags

(Not tracked)


(Whiteboard: [qf:meta])


(2 attachments)



3 months ago
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, 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:


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)

Comment 1

3 months ago
Created attachment 8868238 [details]

Results for speedometer run.

Comment 2

3 months ago
Created attachment 8868239 [details]

Results for general browsing run.

Comment 3

3 months 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)
Depends on: 1365387
As mentioned on IRC, we could probably use |if (| 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.

Comment 5

3 months 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.


3 months ago
Depends on: 1365650

Comment 6

3 months 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

Comment 7

3 months 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


3 months ago
Depends on: 1366263


3 months ago
Whiteboard: [qf]


3 months ago
Depends on: 1366375


3 months ago
Depends on: 1366377


3 months ago
Depends on: 1366696


3 months ago
Depends on: 1367779
Depends on: 1368076
Blocks: 1339557
Whiteboard: [qf] → [qf:p1]

Comment 8

a month 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.

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

Comment 9

a month ago
Just needinfo-ing you as a ping to note that the new measurements you asked for in SF are above.
Flags: needinfo?(andrebargull)


a month ago
Depends on: 1382837

Comment 10

a month 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]


27 days ago
Depends on: 1383643


27 days ago
Depends on: 1383644


27 days ago
Depends on: 1383645


27 days ago
Depends on: 1383646


27 days ago
Depends on: 1383647


27 days ago
Depends on: 1383648

Comment 11

27 days 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)

Comment 12

24 days 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.


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
(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.


20 days ago
Depends on: 1385802


19 days ago
Depends on: 1386001


19 days ago
Depends on: 851769


16 days ago
Depends on: 1387400


13 days ago
Depends on: 1387968


13 days ago
Depends on: 1388034


2 days ago
Depends on: 1391304
You need to log in before you can comment on or make changes to this bug.