微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

javascript – 执行一致性和性能的原型或闭包?

javascript调用方法性能执行和执行时间一致性之间的最佳折衷是什么?

我还在学习javascript,并且会将原型用于大多数事情(即Brendan Eich here),但我认为我发现功能闭合的性能和一致性更好(我知道我可能已经过度优化了).我一直在测试的一种原型模式:

function PrototypeA() {}
PrototypeA.prototype.a = 0;
PrototypeA.prototype.b = 0;
PrototypeA.prototype.someMath = function() {
    this.a += 1;
    this.b += 2;
};
var Test = new PrototypeA();
Test.someMath();

读完这篇文章后决定(太棒了!)post到基准封口.目前的封闭模式我正朝着:

var SubModule = new((function() {
    var a = 0;
    var b = 0;
    var someMath = function() {
        a += 1;
        b += 2;
    };
    return function() {
        this.someMath = someMath
    };
})())();

我发现由于测试设置中的错误(例如在基准测试中调用构造函数或以导致不同范围遍历路径的方式调用方法),各种模式的许多基准都会产生误导.我只是想测试方法执行.

在本地进行了大量的基准测试(基于许多不同模式的benchmark.js)后,我提出了值得注意的模式:

Jsperf Here

我的发现似乎支持组织良好的闭包不会在执行时间上偏离其他类型的对象(我松散地使用术语“类型”).我意识到由于基准测试或设置上的任何数字或错误,我可能完全错误.

谢谢你的期待!

解决方法

由于您的用例是动画,因此您希望坚持使用闭包.使用javascript的简单经验法则是“越多越好.代码越慢”.在jsperf上发布的示例中,最慢的是那些引用它的那些.每次执行此操作时,引擎都必须查看当前对象,并确定是否可以立即在对象上访问您要访问的内容,以及是否必须查找原型链.在关闭方面,你引用的是一个相当有限的范围,由你编写的函数预先确定,引擎要做的最多就是能够查看该范围以引用其中的变量.

现在,有一些问题.首先,当你只引用一次或两次时,使用它会明显加快.在这个例子中并非如此,但值得一提.添加对此引用的次数越多,原型依赖代码就越慢.以this simple perf为例.其次,如果你构建了很多这些模块(例如,如果你正在构建一个数据网格),那么关闭时构造速度非常慢,并且浪费了大量内存.有关速度差,请参见this example.您添加方法属性越多,它就越糟糕.这是因为每次创建一个新的闭包都会产生独特的功能属性,而基于原型的闭包只会重复使用相同的东西.

在任何一种情况下,我的谦虚建议只是看看你正在编程的情况.大多数时候,使用原型是要走的路 – 可读性[在某些情况下],可重用性,可扩展性……但如果它们太慢,那么你就是不能使用它们.话虽如此,将这两个概念结合起来给你提供可重复使用的模块化设置并不会经常受到影响的方法是没有错的.例如,尝试使用’Mixins’:

var Mixin = {
    interval: 100,finish: function () { window.clearInterval(this.intervalRef); },start: function (callback) { this.intervalRef = window.setInterval(callback,this.interval)
};

var Module = (function () {
    function getMessage () {
        return "weee!";
    }
    var somethingThatReallyNeedsspeed = function () {
        var iterations,self = this;

        this.start(function () {
            console.log(getMessage());
            iterations++;
            if(iterations > 10000) {
               self.finish();
            }
        });
    }
    somethingThatReallyNeedsspeed.prototype = Mixin;
    return somethingThatReallyNeedsspeed;
})();

在这个例子中,由于原型只是设置为引用Mixin对象,因此构造速度不会受到影响 – 有两种方法和特性函数每次都不需要构造的属性,但它仍然可用通过这个.

< /咆哮>

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐