如何在JavaScript中以C#/C++风格实现最高性能的OOP布局?
性能优先:JS中模拟C#/C++风格OOP的虚方法与非虚方法性能对比
咱直奔主题——这是个纯粹的性能问题,我完全不关心可维护性或可读性!我的目标就是探究如何用C#/C++风格在JavaScript里实现性能最优的OOP布局,重点聚焦虚方法(Virtual Method)与非虚方法(Non-Virtual Method)的性能差异,核心考量点包括:显式传递this对象的开销、原型链方法查找的开销,以及数组(模拟vtable)方法查找的开销。
先放上我定义的对象代码:
MyObjectvtable = []; function MyInnerObject() {} function MyObject() { this.mNum = 0; this.mObject = new MyInnerObject(); this.mStr = "hello!"; this.vtable = MyObjectvtable; } function VirtualMethod() { var that = this; console.log(String(that.mNum) + that.mStr); }; function NonVirtual(that) { console.log(String(that.mNum) + that.mStr); } MyObject.prototype.VirtualMethod = VirtualMethod; MyObjectvtable[0] = VirtualMethod; MyObjectvtable[1] = NonVirtual; pobj = new MyObject();
针对这个对象,我构思了四种不同的方法调用方式:
方法1 - Virtual Prototype(原型链调用虚方法)
这是最常规的原型链调用方式:
pobj.VirtualMethod();
方法2 - NonVirtual(显式传递对象调用非虚方法)
直接把对象作为参数传给全局函数,跳过this绑定:
NonVirtual(pobj);
方法3 - vtable-this-bind(通过vtable查找并绑定this调用方法)
模拟C++的vtable机制,先从数组里拿到方法,再绑定this后调用:
pobj.vtable[0].bind(pobj)();
方法4 - vtable-explicit-bind(通过vtable查找并显式传递对象调用方法)
同样用vtable查找方法,但不绑定this,而是显式把对象作为参数传入:
pobj.vtable[1](pobj);
我已经在JSPerf上创建了对应的测试用例,但目前测试结果还不够明确。在Firefox浏览器中,NonVirtual方法的表现明显更优——它大概率是四种方式里最快的,但这里要注意,这种方式涉及全局函数的访问,可能会对性能测试结果有影响。
内容的提问来源于stack exchange,提问作者Nick
相关产品推荐
相关产品推荐

