Skip to content
New issue

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

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

Already on GitHub? Sign in to your account

Spread operator slow with application builder #28874

Open
jopelle1 opened this issue Nov 15, 2024 · 2 comments
Open

Spread operator slow with application builder #28874

jopelle1 opened this issue Nov 15, 2024 · 2 comments

Comments

@jopelle1
Copy link

jopelle1 commented Nov 15, 2024

Which @angular/* package(s) are the source of the bug?

compiler

Is this a regression?

No

Description

Hello,
I noticed that the spread operator is significantly slower (sometimes more than 2x slower) when using vite instead of webpack.
This doubles the loading time of some of our components.

In my minimal reproduction, I get an average of 10ms with webpack and 35ms with vite, with both firefox and chrome.

Is this indeed an issue with angular and is there any way to fix it?

Thank you

Please provide a link to a minimal reproduction of the bug

https://github.com/jopelle1/repro-angular-vite

Please provide the environment you discovered this bug in (run ng version)

Angular CLI: 17.3.11
Node: 18.20.4
Package Manager: npm 10.8.2
OS: linux x64

Angular: 17.3.12
... animations, common, compiler, compiler-cli, core, forms
... platform-browser, platform-browser-dynamic, router

Package                         Version
---------------------------------------------------------
@angular-devkit/architect       0.1703.11
@angular-devkit/build-angular   17.3.11
@angular-devkit/core            17.3.11
@angular-devkit/schematics      17.3.11
@angular/cli                    17.3.11
@schematics/angular             17.3.11
rxjs                            7.8.1
typescript                      5.4.5
zone.js                         0.14.10

Anything else?

No response

@JeanMeche JeanMeche transferred this issue from angular/angular Nov 15, 2024
@JeanMeche
Copy link
Member

JeanMeche commented Nov 15, 2024

Your repro is in v17 but I can also reproduce it in v19.

This is due to the downleveling of native spread by this code.
Which mentions this Chromium performance issue : https://issues.chromium.org/u/1/issues/42201529?pli=1

Fwiw, by running the perf test provided in the issue :

  runTest() {
    const now = performance.now();
    const a = [];  
    for (let j = 0; j < 5625; j++) {  
      a.push(f(75));  
    }  
    return performance.now() - now;
  }


function objectSpread(m: any, n:any) {  
  return {...m, ...n};  
}  
  
function f(i:number) {  
  const m:Record<number,number> = {}, n:Record<number,number>  = {};  
  for (let k = 0; k < i; k++) {  
    m[Math.random()] = 0;  
    n[Math.random()] = 0;  
  }  
  return objectSpread(m, n);  
}  

We do get better performance with the downleveling than with the native spread.

@dgp1130 dgp1130 changed the title Spread operator slow with vite Spread operator slow with application builder Nov 19, 2024
@alan-agius4 alan-agius4 added area: @angular/build freq1: low Only reported by a handful of users who observe it rarely labels Nov 20, 2024
@dgp1130
Copy link
Collaborator

dgp1130 commented Nov 20, 2024

Thanks for bringing this up, we're keeping an eye on the Chromium issue. There is a complex trade off since:

With random input object properties, spread is still 2x slower than assign.

It's hard to say that native spread will be a net perf improvement for all Angular apps. We'll keep watching and see if/when it's appropriate to switch to native.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

4 participants