-
-
Notifications
You must be signed in to change notification settings - Fork 36.1k
Description
Describe the bug
I've noticed a significant performance drop in my application when I upgraded the THREE.JS version. Initially from 0.102.0 to 0.125.2, but I've narrowed it down to a change from 0.119.1 to 0.120.0. A single model step in my app (simulation) increased from ~10ms to ~50ms.
I've used JS profiler and noticed that Vector3.clone() is at the top now:

I'm using THREE.Vector3 in the simulation part of the app, and since many vector operations are implemented in place, .clone() calls are very common. When I downgrade version to 0.119.1, the clone operation isn't there anymore and the model step calculates 4 times faster.
I did a little investigation and replacing Object.defineProperty( this, 'isVector3', { value: true } ); in THREE.Vector3 constructor with this.isVector3 = true; fixes the issue.
To Reproduce, Live example
- r125, slow clone: https://jsfiddle.net/9hrmuLxw/ (open console to see the result)
- r120, slow clone: https://jsfiddle.net/nb0uw1ay/ (open console to see the result)
- r119, fast clone: https://jsfiddle.net/p2bu1qte/ (open console to see the result)
On my machine, the difference is 5ms (r119) vs 45ms (r120, r125).
I don't think it'd be useful here, but the app I'm working on:
https://tectonic-explorer.concord.org/?preset=subduction
Expected behavior
No .clone performance drop.
Screenshots
THREE.JS version 0.119.1 vs 0.120.0:
Platform:
- Device: Desktop
- OS: MacOS
- Browser: Chrome v88
- Three.js version: r120.0 and newer, r119 is the last one that works fine
