mirror of
https://github.com/dart-lang/sdk
synced 2024-10-14 17:59:39 +00:00
a332c17c50
- Add mixins to the implementation classes rather than the base classes. This makes `this.member` calls in the mixed-in members direct calls and allows inlining. - Make immutable classes subclasses of mutable classes. This makes sure we have one `[]` implementation per typed list type and allows inlining `[]`. - Implement specialized iterators for each typed list. This allows unboxed and unchecked iteration of array elements. # Final class hierarchy: - `final class JSARrayBufferImpl implements ByteBuffer`: The JS `ArrayBuffer` class. - `final class JSDataViewImpl implements ByteData`: The JS `DataView` class. - `abstract class JSArrayBase implements TypedData`: Base class for all typed array classes. Implements common operations on the the `DataView` `externref`. ## Array classes - `_IntListMixin`: Implements `List<int>` operations. Declares unchecked getters and setters and uses them when possible for performance. - `_UnmodifiableIntListMixin`: Overrides only `get buffer`, `[]=`, and `setRange` to convert a `List<int>` implemented with `_IntListMixin` to unmodifiable. - `JSUint8ArrayImpl extends JSArrayBase with _IntListMixin implements Uint8List`: The `Uint8Array` class. - One class as above for `Int8Array`, `Uint16Array` etc. - `UnmodifiableJSUint8Array extends JSUint8ArrayImpl with _UnmodifiableIntListMixin implements UnmodifiableUint8ListView`: Same as `JSUint8ArrayImpl`, but made immutable with `_UnmodifiableIntListMixin`. - One class as above for the rest of the int arrays. - `double` classes have the same structure as the `int` classes. ## Iterator classes To allow fast iteration with `get iterator`, each array class has its own iterator class. Compared to a generic iterator shared by all classes, these classes (1) do direct (instead of virtual) and unchecked (instead of bound checked) calls to read the elements (2) avoid boxing the `current` elements by having a field with the right non-nullable type, `int` or `double`. # Benchmarks In a benchmark that decodes a 1.3M large protobuf: - Before: 35.9 seconds. - After: 3.2 seconds. (Remaining performance issues in this benchmark are in the `dart:convert` implementation for JSCM, which I will be optimizing separately) Change-Id: I5f29882600c1ca95972e2a62af22b181787cb73a Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/334465 Commit-Queue: Ömer Ağacan <omersa@google.com> Reviewed-by: Aske Simon Christensen <askesc@google.com> |
||
---|---|---|
.. | ||
_http | ||
_internal | ||
_wasm | ||
async | ||
cli | ||
collection | ||
convert | ||
core | ||
developer | ||
ffi | ||
html | ||
indexed_db | ||
internal | ||
io | ||
isolate | ||
js | ||
js_interop | ||
js_interop_unsafe | ||
js_util | ||
math | ||
mirrors | ||
svg | ||
typed_data | ||
vmservice | ||
web_audio | ||
web_gl | ||
web_sql | ||
analysis_options.yaml | ||
libraries.json | ||
libraries.yaml | ||
PRESUBMIT.py | ||
vmservice_libraries.json | ||
vmservice_libraries.yaml |