Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/364.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
是什么导致用++;在我的JavaScriptES6类中,会有如此高的性能吗?_Javascript_Ecmascript 6_Emulation_Increment - Fatal编程技术网

是什么导致用++;在我的JavaScriptES6类中,会有如此高的性能吗?

是什么导致用++;在我的JavaScriptES6类中,会有如此高的性能吗?,javascript,ecmascript-6,emulation,increment,Javascript,Ecmascript 6,Emulation,Increment,我在用Javascript编写Gameboy模拟器时发现了一个非常具体的问题。我刚刚完成了音频部分的实现,并使用一个简单的计数器来检查音频逻辑何时需要更新。这背后的原因是因为音频时钟运行在模拟CPU时钟的一小部分 在我的模拟器中,我有4个不同的音频通道。所有这些都是作为ES6类编写的,具有某种形式的继承。每个通道负责跟踪计数器,因此我们有一个可用的时钟,并在音频通道内执行逻辑。然而,当我运行Chrome profiler时,我注意到奇怪的行为显示出巨大的性能损失,只是增加了这个数字: 我试过不

我在用Javascript编写Gameboy模拟器时发现了一个非常具体的问题。我刚刚完成了音频部分的实现,并使用一个简单的计数器来检查音频逻辑何时需要更新。这背后的原因是因为音频时钟运行在模拟CPU时钟的一小部分

在我的模拟器中,我有4个不同的音频通道。所有这些都是作为ES6类编写的,具有某种形式的继承。每个通道负责跟踪计数器,因此我们有一个可用的时钟,并在音频通道内执行逻辑。然而,当我运行Chrome profiler时,我注意到奇怪的行为显示出巨大的性能损失,只是增加了这个数字:

我试过不同的方法:

  • 确保在类的开头实例化属性
  • 将该值放入临时变量中,递增并放回(最后一行会导致相同的问题)
  • 做一系列的递增和递减,确保这不是一次性的。此变量的每一次更改都会对性能造成很大的影响
因此,我所做的一切似乎都指向了这样一个事实:改变房产的价值会导致巨大的性能损失。我已经读了一些关于V8引擎的内联缓存的内容,但是到目前为止还没有发现任何有用的东西

如果有人想查看完整的源代码,您可以在此处找到音频频道代码:

如果要运行emulator并查看并尝试查看自己,可以在此处播放:

尤其是口袋妖怪似乎有一些麻烦,在介绍动画的两个口袋妖怪战斗

另一个非常奇怪的观察结果是,将计数器包装在对象中可以显著缩短处理时间:

//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++;