Javascript静态方法与原型/实例化方法的性能比较

eat*_*hil 5 javascript static-methods prototypal-inheritance

我一直在尝试在Javascript中使用静态方法。与其让对象继承自原型,不如使用鸭式输入。

var Controller = {};
Controller.getData = function() {//return data};

// and then in use:
var page = route.getPage();
require([page], function(Controller) {
    Controller.getData();
});
Run Code Online (Sandbox Code Playgroud)

我可以通过使用Controller原型创建新对象来做到这一点:

function Controller() {};
Controller.prototype.getData = function() {//return data};

// and then in use:
var page = route.getPage();
require([page], function(Controller) {
    var controller = new Controller();
    controller.getData();
});
Run Code Online (Sandbox Code Playgroud)

我的直觉是静态方法会更快,但我不知道。通常,这两种方法之间的性能差异是什么?

TLDR;基本上这个问题,但对于Javascript。

Rob*_* M. 6

编辑:因此,当您实例化类与调用“静态”版本时,存在一些性能差异,但这种差异并不能真正保证您对代码进行任何更改(过早优化),除非您看到实际减慢。

正如我设置的基本jsperf测试所示,性能上确实没有太大区别。您应该根据是否希望上下文 ( this) 引用您的基类来做出决定。

  • @eatonphil 我更新了我的答案,每秒仍获得 3300 万次操作,而使用静态方法则为 4300 万次。除非你正在做一些绝对令人难以置信的工作量,每秒需要 45M 操作,否则这属于过早优化的范围 (2认同)
  • 所有的测试都是有误导性的。静态版本更快只是因为每次都在堆上实例化一个对象(导致分配和 GC 压力)。调用本身没有任何实质性差异。最开始的问题本身就是错误的。静态函数与原型函数在性能方面是相同的(原型甚至更快,因为它通常利用 JIT 优化)。也就是说,应该出于设计目的而做出选择,而不是为了急于优化。 (2认同)