Javascript 单例实例-性能-为什么糟糕的代码会更快?

Javascript 单例实例-性能-为什么糟糕的代码会更快?,javascript,singleton,benchmarking,ecmascript-5,Javascript,Singleton,Benchmarking,Ecmascript 5,我用Javascript类构造尝试了不同的方法来创建单例 我最终得到了两个版本——其他版本似乎比较慢,或者可能存在递归问题 第1版 class Test { constructor() { if(Test.ins) { return Test.ins; } Test.ins = this; this.r = Math.random(); } } 第2版 class Test4 { constructor() {

我用Javascript类构造尝试了不同的方法来创建单例

我最终得到了两个版本——其他版本似乎比较慢,或者可能存在递归问题

第1版

class Test {
   constructor() {
     if(Test.ins) {
        return Test.ins;
     }
     Test.ins = this;
     this.r = Math.random();
  }
}
第2版

class Test4 {
   constructor() {
     Test4.ins = this;
     this.r = Math.random();
  }
  static getInstance() {
     if(Test4.ins) {
        return Test4.ins;
     }
     return new Test4();
  }
}
为什么我认为第1版风格不好:

  • 构造函数不应返回实例
  • 没有人会期望通过使用new Test()得到一个单例实例
  • 至少在Typescript中,单例的构造函数应该是私有的
为什么构造函数在版本2中设置singleton intance

class Test4 {
   constructor() {
     Test4.ins = this;
     this.r = Math.random();
  }
  static getInstance() {
     if(Test4.ins) {
        return Test4.ins;
     }
     return new Test4();
  }
}
  • 首先,它更快——不知道为什么。但是它更快
  • 如果我们在试图获取单例实例的构造函数中调用函数,它可以防止某种递归
尽管如此,我还是得到了这两个版本。 但现在,我对它们进行了基准测试并进行了比较。 最后,版本1的速度提高了40%。我不知道为什么会这样。如果我们一步一步地去做。这两种功能同等重要。如果选中实例并返回


这是我的基准脚本:

“构造函数永远不应该返回实例”-呃,构造函数总是返回实例?@Bergi:我认为OP意味着构造函数不应该使用return关键字。这就是nathan所说的^^^我不明白你为什么在这里很关心性能。您的基准测试代码实际上做的不多,所以两个方法调用比一个方法调用花费的时间更长也就不足为奇了。仅静态方法的属性查找可能是这里的区别。我只是想了解她在做什么。第一次打电话时,是的,有区别。但是在连续调用中,ops应该完全相同。“构造函数不应该返回实例”-呃,构造函数总是返回实例?@Bergi:我认为OP的意思是构造函数不应该使用return关键字。这就是nathan所说的^^^我不明白你为什么在这里很关心性能。您的基准测试代码实际上做的不多,所以两个方法调用比一个方法调用花费的时间更长也就不足为奇了。仅静态方法的属性查找可能是这里的区别。我只是想了解她在做什么。第一次打电话时,是的,有区别。但在连续呼叫中,这里的老年退休金计划应该完全相同。