是什么导致用++;在我的JavaScriptES6类中,会有如此高的性能吗?
我在用Javascript编写Gameboy模拟器时发现了一个非常具体的问题。我刚刚完成了音频部分的实现,并使用一个简单的计数器来检查音频逻辑何时需要更新。这背后的原因是因为音频时钟运行在模拟CPU时钟的一小部分 在我的模拟器中,我有4个不同的音频通道。所有这些都是作为ES6类编写的,具有某种形式的继承。每个通道负责跟踪计数器,因此我们有一个可用的时钟,并在音频通道内执行逻辑。然而,当我运行Chrome profiler时,我注意到奇怪的行为显示出巨大的性能损失,只是增加了这个数字: 我试过不同的方法:是什么导致用++;在我的JavaScriptES6类中,会有如此高的性能吗?,javascript,ecmascript-6,emulation,increment,Javascript,Ecmascript 6,Emulation,Increment,我在用Javascript编写Gameboy模拟器时发现了一个非常具体的问题。我刚刚完成了音频部分的实现,并使用一个简单的计数器来检查音频逻辑何时需要更新。这背后的原因是因为音频时钟运行在模拟CPU时钟的一小部分 在我的模拟器中,我有4个不同的音频通道。所有这些都是作为ES6类编写的,具有某种形式的继承。每个通道负责跟踪计数器,因此我们有一个可用的时钟,并在音频通道内执行逻辑。然而,当我运行Chrome profiler时,我注意到奇怪的行为显示出巨大的性能损失,只是增加了这个数字: 我试过不
- 确保在类的开头实例化属性
- 将该值放入临时变量中,递增并放回(最后一行会导致相同的问题)
- 做一系列的递增和递减,确保这不是一次性的。此变量的每一次更改都会对性能造成很大的影响
//In the constructor:
this.fs = {counter: 0};
//In the step() method:
this.fs.counter++;
编辑:我只是通过将所需的代码复制到每个类中,删除了所有基于继承的代码。这样就不再需要调用“super”。这大大提高了性能。让类相互继承似乎会对V8引擎的性能产生很大影响。正如您所说,浏览器可能存在继承问题。尝试使用babel,这样您的代码将编译为es2015。这样,您的模块性保持不变。请告诉我们。您链接的源文件不包含您在此处发布的代码?“它们都是作为ES6类编写的”-不,类中的那些“属性声明”不属于ES6
class
语法的一部分。你到底在哪里运行这段代码?你以前传送过吗?您应该始终在构造函数中初始化所有实例属性,否则它们将无法正确优化。使用babel进行转换会使情况变得更糟,因为该代码会产生大量开销。到目前为止,最好的选择似乎是为不同的通道复制所有代码。对于无效的ES6类,这是为了让引擎知道期望的属性,这样就不会有任何缓存。很抱歉没有完全相同的属性名Bergi。我们看到的是这个。frameSequencerIf babel不起作用,为什么不尝试使用依赖注入?
//Every line would give a big performance spike causing the emulator to be unplayable.
this.fs++;
this.fs--;
this.fs++;
this.fs--;
this.fs++;
this.fs--;
this.fs++;
this.fs--;
this.fs++;
this.fs--;
this.fs++;
this.fs--;
this.fs++;
//In the constructor:
this.fs = {counter: 0};
//In the step() method:
this.fs.counter++;