Skip to content

Add __spreadArrays helper #31166

New issue

Have a question about this project? # for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “#”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? # to your account

Merged
merged 2 commits into from
Jun 11, 2019
Merged

Add __spreadArrays helper #31166

merged 2 commits into from
Jun 11, 2019

Conversation

rbuckton
Copy link
Contributor

@rbuckton rbuckton commented Apr 29, 2019

Adds a __spreadArrays helper for a more accurate spread behavior when not using --downlevelIteration.

Fixes #8856

@rbuckton
Copy link
Contributor Author

@typescript-bot perf test

@typescript-bot
Copy link
Collaborator

typescript-bot commented Apr 29, 2019

Heya @rbuckton, I've started to run the perf test suite on this PR at 528601f. You can monitor the build here. It should now contribute to this PR's status checks.

Update: The results are in!

@typescript-bot
Copy link
Collaborator

@rbuckton
The results of the perf run you requested are in!

Here they are:

Comparison Report - master..31166

Metric master 31166 Delta Best Worst
Angular - node (v12.1.0, x64)
Memory used 313,388k (± 0.02%) 313,430k (± 0.02%) +42k (+ 0.01%) 313,303k 313,531k
Parse Time 1.38s (± 0.68%) 1.42s (± 0.94%) +0.04s (+ 2.83%) 1.40s 1.45s
Bind Time 0.73s (± 0.65%) 0.74s (± 1.13%) +0.00s (+ 0.27%) 0.72s 0.75s
Check Time 3.96s (± 0.59%) 3.98s (± 0.40%) +0.02s (+ 0.40%) 3.94s 4.00s
Emit Time 5.14s (± 0.82%) 5.14s (± 0.51%) +0.00s (+ 0.06%) 5.08s 5.19s
Total Time 11.21s (± 0.54%) 11.27s (± 0.40%) +0.06s (+ 0.51%) 11.15s 11.34s
Monaco - node (v12.1.0, x64)
Memory used 341,959k (± 0.02%) 342,000k (± 0.02%) +41k (+ 0.01%) 341,868k 342,106k
Parse Time 1.17s (± 0.66%) 1.19s (± 0.52%) +0.02s (+ 1.71%) 1.18s 1.20s
Bind Time 0.67s (± 0.97%) 0.67s (± 1.41%) +0.01s (+ 0.90%) 0.66s 0.70s
Check Time 4.06s (± 0.51%) 4.04s (± 0.43%) -0.02s (- 0.42%) 4.00s 4.09s
Emit Time 2.77s (± 0.59%) 2.76s (± 0.58%) -0.00s (- 0.14%) 2.74s 2.80s
Total Time 8.66s (± 0.30%) 8.67s (± 0.32%) +0.01s (+ 0.12%) 8.62s 8.74s
TFS - node (v12.1.0, x64)
Memory used 298,947k (± 0.01%) 298,897k (± 0.03%) -51k (- 0.02%) 298,743k 299,064k
Parse Time 0.92s (± 0.74%) 0.92s (± 0.96%) +0.01s (+ 0.87%) 0.90s 0.95s
Bind Time 0.62s (± 0.93%) 0.62s (± 0.60%) -0.00s (- 0.81%) 0.61s 0.62s
Check Time 3.62s (± 0.41%) 3.64s (± 0.55%) +0.02s (+ 0.58%) 3.58s 3.67s
Emit Time 2.86s (± 0.85%) 2.85s (± 0.86%) -0.00s (- 0.14%) 2.78s 2.91s
Total Time 8.01s (± 0.41%) 8.03s (± 0.43%) +0.02s (+ 0.27%) 7.94s 8.10s
Angular - node (v8.9.0, x64)
Memory used 330,848k (± 0.02%) 330,894k (± 0.02%) +46k (+ 0.01%) 330,786k 331,042k
Parse Time 1.78s (± 0.47%) 1.79s (± 0.27%) +0.02s (+ 1.01%) 1.78s 1.80s
Bind Time 0.79s (± 0.98%) 0.80s (± 0.86%) +0.01s (+ 0.63%) 0.78s 0.81s
Check Time 4.66s (± 1.58%) 4.62s (± 1.42%) -0.04s (- 0.90%) 4.48s 4.75s
Emit Time 5.88s (± 2.75%) 5.88s (± 2.64%) +0.00s (+ 0.03%) 5.60s 6.18s
Total Time 13.11s (± 0.98%) 13.09s (± 0.98%) -0.02s (- 0.16%) 12.85s 13.33s
Monaco - node (v8.9.0, x64)
Memory used 358,630k (± 0.02%) 358,689k (± 0.02%) +59k (+ 0.02%) 358,503k 358,904k
Parse Time 1.43s (± 0.34%) 1.45s (± 0.54%) +0.01s (+ 1.05%) 1.42s 1.46s
Bind Time 0.92s (± 0.67%) 0.90s (± 1.40%) -0.03s (- 2.82%) 0.87s 0.91s
Check Time 4.73s (± 0.45%) 4.86s (± 1.76%) +0.13s (+ 2.72%) 4.73s 5.04s
Emit Time 3.40s (± 0.54%) 3.15s (± 6.58%) -0.25s (- 7.38%) 2.80s 3.40s
Total Time 10.49s (± 0.32%) 10.36s (± 1.36%) -0.13s (- 1.23%) 10.10s 10.56s
TFS - node (v8.9.0, x64)
Memory used 314,046k (± 0.01%) 314,055k (± 0.01%) +9k (+ 0.00%) 313,962k 314,165k
Parse Time 1.14s (± 0.54%) 1.14s (± 0.77%) +0.00s (+ 0.35%) 1.13s 1.17s
Bind Time 0.66s (± 0.61%) 0.67s (± 1.12%) +0.01s (+ 0.91%) 0.65s 0.69s
Check Time 4.19s (± 0.40%) 4.22s (± 0.63%) +0.03s (+ 0.62%) 4.17s 4.26s
Emit Time 3.13s (± 0.61%) 3.12s (± 0.51%) -0.00s (- 0.13%) 3.09s 3.17s
Total Time 9.12s (± 0.35%) 9.15s (± 0.37%) +0.03s (+ 0.35%) 9.08s 9.21s
Angular - node (v8.9.0, x86)
Memory used 187,343k (± 0.02%) 187,360k (± 0.02%) +17k (+ 0.01%) 187,282k 187,438k
Parse Time 1.72s (± 0.80%) 1.75s (± 0.58%) +0.04s (+ 2.04%) 1.73s 1.77s
Bind Time 0.93s (± 0.74%) 0.93s (± 1.97%) -0.00s (- 0.11%) 0.89s 0.98s
Check Time 4.30s (± 0.50%) 4.30s (± 0.31%) -0.01s (- 0.19%) 4.27s 4.33s
Emit Time 5.64s (± 1.17%) 5.64s (± 1.19%) +0.00s (+ 0.02%) 5.51s 5.77s
Total Time 12.59s (± 0.73%) 12.61s (± 0.62%) +0.03s (+ 0.21%) 12.44s 12.78s
Monaco - node (v8.9.0, x86)
Memory used 200,012k (± 0.01%) 200,027k (± 0.02%) +14k (+ 0.01%) 199,920k 200,088k
Parse Time 1.48s (± 0.55%) 1.51s (± 0.84%) +0.03s (+ 1.96%) 1.48s 1.54s
Bind Time 0.72s (± 2.43%) 0.71s (± 0.73%) -0.01s (- 1.80%) 0.70s 0.72s
Check Time 4.62s (± 0.60%) 4.62s (± 0.51%) +0.00s (+ 0.02%) 4.55s 4.65s
Emit Time 3.09s (± 0.57%) 3.07s (± 0.45%) -0.01s (- 0.39%) 3.05s 3.12s
Total Time 9.90s (± 0.37%) 9.91s (± 0.29%) +0.01s (+ 0.09%) 9.85s 9.97s
TFS - node (v8.9.0, x86)
Memory used 176,085k (± 0.03%) 176,092k (± 0.02%) +8k (+ 0.00%) 176,007k 176,198k
Parse Time 1.18s (± 1.01%) 1.21s (± 1.00%) +0.02s (+ 2.03%) 1.19s 1.24s
Bind Time 0.63s (± 0.94%) 0.63s (± 0.75%) -0.00s (- 0.63%) 0.62s 0.64s
Check Time 4.04s (± 0.52%) 4.06s (± 0.89%) +0.02s (+ 0.45%) 3.99s 4.12s
Emit Time 2.75s (± 1.24%) 2.73s (± 1.22%) -0.02s (- 0.76%) 2.68s 2.83s
Total Time 8.61s (± 0.64%) 8.63s (± 0.76%) +0.02s (+ 0.20%) 8.48s 8.73s
Angular - node (v9.0.0, x64)
Memory used 330,616k (± 0.02%) 330,548k (± 0.02%) -69k (- 0.02%) 330,446k 330,693k
Parse Time 1.62s (± 0.50%) 1.63s (± 0.29%) +0.01s (+ 0.43%) 1.62s 1.64s
Bind Time 0.74s (± 1.11%) 0.74s (± 0.90%) -0.01s (- 0.67%) 0.73s 0.75s
Check Time 4.34s (± 0.48%) 4.31s (± 0.53%) -0.03s (- 0.67%) 4.25s 4.38s
Emit Time 5.73s (± 1.77%) 5.71s (± 1.77%) -0.02s (- 0.40%) 5.51s 5.91s
Total Time 12.44s (± 1.01%) 12.39s (± 0.82%) -0.05s (- 0.36%) 12.19s 12.60s
Monaco - node (v9.0.0, x64)
Memory used 358,518k (± 0.02%) 358,607k (± 0.02%) +89k (+ 0.02%) 358,411k 358,736k
Parse Time 1.28s (± 0.71%) 1.29s (± 0.53%) +0.01s (+ 1.01%) 1.28s 1.31s
Bind Time 0.85s (± 0.40%) 0.85s (± 0.70%) -0.01s (- 0.82%) 0.84s 0.86s
Check Time 4.68s (± 0.47%) 4.71s (± 0.37%) +0.02s (+ 0.49%) 4.68s 4.75s
Emit Time 3.27s (± 1.63%) 3.28s (± 0.51%) +0.01s (+ 0.40%) 3.23s 3.30s
Total Time 10.09s (± 0.73%) 10.13s (± 0.30%) +0.04s (+ 0.39%) 10.03s 10.18s
TFS - node (v9.0.0, x64)
Memory used 313,931k (± 0.02%) 313,909k (± 0.02%) -22k (- 0.01%) 313,799k 314,070k
Parse Time 1.00s (± 0.33%) 1.01s (± 0.37%) +0.01s (+ 1.50%) 1.01s 1.02s
Bind Time 0.62s (± 0.77%) 0.61s (± 0.95%) -0.00s (- 0.65%) 0.60s 0.63s
Check Time 4.23s (± 2.06%) 4.24s (± 2.17%) +0.01s (+ 0.19%) 4.12s 4.45s
Emit Time 2.97s (± 3.30%) 2.98s (± 3.20%) +0.02s (+ 0.54%) 2.82s 3.14s
Total Time 8.81s (± 0.47%) 8.85s (± 0.39%) +0.04s (+ 0.44%) 8.76s 8.91s
Angular - node (v9.0.0, x86)
Memory used 187,522k (± 0.03%) 187,512k (± 0.03%) -10k (- 0.01%) 187,396k 187,658k
Parse Time 1.54s (± 0.58%) 1.57s (± 0.86%) +0.04s (+ 2.35%) 1.55s 1.61s
Bind Time 0.86s (± 0.55%) 0.89s (± 0.77%) +0.03s (+ 2.91%) 0.87s 0.90s
Check Time 4.01s (± 0.54%) 4.05s (± 0.65%) +0.04s (+ 0.95%) 4.00s 4.13s
Emit Time 5.33s (± 0.79%) 5.39s (± 0.76%) +0.06s (+ 1.20%) 5.32s 5.53s
Total Time 11.73s (± 0.40%) 11.89s (± 0.65%) +0.16s (+ 1.36%) 11.79s 12.16s
Monaco - node (v9.0.0, x86)
Memory used 200,072k (± 0.03%) 200,057k (± 0.02%) -14k (- 0.01%) 199,996k 200,211k
Parse Time 1.31s (± 0.58%) 1.33s (± 0.60%) +0.02s (+ 1.76%) 1.31s 1.35s
Bind Time 0.64s (± 0.90%) 0.64s (± 1.41%) +0.00s (+ 0.16%) 0.63s 0.67s
Check Time 4.48s (± 0.29%) 4.48s (± 0.40%) -0.00s (- 0.04%) 4.43s 4.50s
Emit Time 2.99s (± 0.37%) 3.00s (± 0.69%) +0.01s (+ 0.20%) 2.96s 3.06s
Total Time 9.41s (± 0.20%) 9.44s (± 0.31%) +0.02s (+ 0.27%) 9.39s 9.52s
TFS - node (v9.0.0, x86)
Memory used 176,172k (± 0.02%) 176,236k (± 0.02%) +64k (+ 0.04%) 176,139k 176,319k
Parse Time 1.03s (± 1.53%) 1.04s (± 0.66%) +0.01s (+ 0.68%) 1.02s 1.05s
Bind Time 0.57s (± 1.43%) 0.58s (± 0.77%) +0.01s (+ 0.87%) 0.57s 0.59s
Check Time 3.89s (± 0.69%) 3.92s (± 0.63%) +0.03s (+ 0.77%) 3.88s 4.00s
Emit Time 2.69s (± 0.71%) 2.71s (± 0.89%) +0.02s (+ 0.63%) 2.66s 2.76s
Total Time 8.18s (± 0.62%) 8.24s (± 0.38%) +0.06s (+ 0.76%) 8.17s 8.30s
System
Machine Namets-ci-ubuntu
Platformlinux 4.4.0-142-generic
Architecturex64
Available Memory16 GB
Available Memory1 GB
CPUs4 × Intel(R) Core(TM) i7-4770 CPU @ 3.40GHz
Hosts
  • node (v12.1.0, x64)
  • node (v8.9.0, x64)
  • node (v8.9.0, x86)
  • node (v9.0.0, x64)
  • node (v9.0.0, x86)
Scenarios
  • Angular - node (v12.1.0, x64)
  • Angular - node (v8.9.0, x64)
  • Angular - node (v8.9.0, x86)
  • Angular - node (v9.0.0, x64)
  • Angular - node (v9.0.0, x86)
  • Monaco - node (v12.1.0, x64)
  • Monaco - node (v8.9.0, x64)
  • Monaco - node (v8.9.0, x86)
  • Monaco - node (v9.0.0, x64)
  • Monaco - node (v9.0.0, x86)
  • TFS - node (v12.1.0, x64)
  • TFS - node (v8.9.0, x64)
  • TFS - node (v8.9.0, x86)
  • TFS - node (v9.0.0, x64)
  • TFS - node (v9.0.0, x86)
Benchmark Name Iterations
Current 31166 10
Baseline master 10

@rbuckton rbuckton requested a review from weswigham April 30, 2019 00:10
@rbuckton rbuckton marked this pull request as ready for review April 30, 2019 00:10
@MaxGraey
Copy link

MaxGraey commented May 1, 2019

What about speedup __spreadArrays?

var __spreadArrays = function () {
  for (var i = 0, l = 0, al = arguments.length; i < al; ++i)
    l += arguments[i].length;
  for (var ar = new Array(l), i = 0, k = 0; i < al; ++i)
    for (var j = 0, a = arguments[i], jl = a.length; j < jl; ++j, ++k)
      ar[k] = a[j];
  return ar;
};

On V8 7.4 this faster by ~3x-6x for large (> 1k) arrays.

ben

Bench link:
https://esbench.com/bench/5cc9a0f14cd7e6009ef62323

}
}

function isPackedElement(node: Expression) {
return !isOmittedExpression(node);
Copy link
Member

@weswigham weswigham Jun 10, 2019

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

const innerSpreadEmpty = [1, 2, ...[...[,,,]]]

?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Works just fine.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It basically catches [...[1, 2]] and turns it into [1, 2] rather than calling the helper.

@rbuckton

This comment has been minimized.

@typescript-bot

This comment has been minimized.

@rbuckton
Copy link
Contributor Author

@typescript-bot test this

@typescript-bot
Copy link
Collaborator

typescript-bot commented Jun 11, 2019

Heya @rbuckton, I've started to run the extended test suite on this PR at d6b3a11. You can monitor the build here. It should now contribute to this PR's status checks.

@rbuckton
Copy link
Contributor Author

Verified that the only differences in our RWC suite are expected.

# for free to join this conversation on GitHub. Already have an account? # to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

Spread operator is not correctly translated into JS
6 participants