Closed
Bug 894881
Opened 11 years ago
Closed 11 years ago
Accessing typed array properties like byteLength is very slow
Categories
(Core :: JavaScript Engine, defect)
Core
JavaScript Engine
Tracking
()
RESOLVED
FIXED
mozilla28
People
(Reporter: jandem, Assigned: jandem)
References
(Blocks 1 open bug)
Details
(Whiteboard: [qa-])
Attachments
(1 file)
5.45 KB,
patch
|
bhackett1024
:
review+
|
Details | Diff | Splinter Review |
Noticed this while looking at bug 862249 (the benchTypedArraySet test there). Accessing a typed array property like byteLength is super slow: -- function f(arr) { var res = 0; for (var i=0; i<1000000; i++) { res = arr.byteLength; } return res; } var t = new Date; f(new Int32Array(1000)); print(new Date - t); -- d8 : 16 ms js no-ion : 171 ms js : 226 ms Note that Ion knows how to optimize .length and indeed that's very fast: js : 1 ms d8 : 16 ms I think we should: (1) Make the getter IC work here; it's probably failing because typed arrays are non-native. (2) Have Ion inline .byteOffset/.byteLength/etc like .length. These are just int32 values stored in fixed slots; should be straight-forward.
Assignee | ||
Comment 1•11 years ago
|
||
Note: I know LICM is hoisting the .length access out of the loop. But that's the point: inlining .byteLength etc allows us to do the same for these other properties.
Comment 2•11 years ago
|
||
This explains a lot! I never considered the possibility that only certain properties got 'special' optimization treatment. Is there a list of them anywhere?
Assignee | ||
Comment 3•11 years ago
|
||
(In reply to Kevin Gadd (:kael) from comment #2) > This explains a lot! I never considered the possibility that only certain > properties got 'special' optimization treatment. Is there a list of them > anywhere? We inline .length on arrays, typed arrays, strings, arguments.. Fixing the getter IC to work with typed arrays brings this down to 12 ms, 4 ms faster than v8. I also want to do (2) in comment 0 but (1) should fix the worst problems.
Assignee | ||
Comment 4•11 years ago
|
||
Fixes the Baseline ICs to cache properties on typed arrays, and fixes IonBuilder so that our inlined-getter-call code works for getters (like byteLength) on typed arrays. Ion should really inline these properties directly without calling the getter (they just load a value from a fixed slot), but for now this is much better than what we were doing. For the micro-benchmark in comment 0: before: 220 ms after: 10 ms (We're not hoisting the property access, once we optimize this property in Ion we can do that.)
Attachment #8333772 -
Flags: review?(bhackett1024)
Comment 5•11 years ago
|
||
Comment on attachment 8333772 [details] [diff] [review] Patch Review of attachment 8333772 [details] [diff] [review]: ----------------------------------------------------------------- ::: js/src/jit/IonBuilder.cpp @@ +5932,5 @@ > +{ > + if (IsTypedArrayClass(clasp)) { > + // Typed arrays have a lookupGeneric hook, but it only handles > + // integers, not names. > + JS_ASSERT(name); Maybe move this assert above the condition?
Attachment #8333772 -
Flags: review?(bhackett1024) → review+
Assignee | ||
Comment 6•11 years ago
|
||
https://hg.mozilla.org/integration/mozilla-inbound/rev/5ef1eb4f5d57 (In reply to Brian Hackett (:bhackett) from comment #5) > Maybe move this assert above the condition? I think it's better to keep it below the comment, to make it clear why the assert is there.
Comment 7•11 years ago
|
||
(In reply to Jan de Mooij [:jandem] from comment #6) > I think it's better to keep it below the comment, to make it clear why the > assert is there. Yeah, though when I see asserts inside a conditional I generally figure that assert might not hold in the other branch, whereas in this case name should always be non-NULL. I guess both the assert and comment could be hoisted.
Comment 8•11 years ago
|
||
https://hg.mozilla.org/mozilla-central/rev/5ef1eb4f5d57
Status: ASSIGNED → RESOLVED
Closed: 11 years ago
Resolution: --- → FIXED
Target Milestone: --- → mozilla28
Updated•10 years ago
|
Whiteboard: [qa-]
You need to log in
before you can comment on or make changes to this bug.
Description
•