性能:对象内部的变量与函数内部的变量

时间:2014-04-07 09:54:36

标签: javascript performance

我正在使用javascript创建混合移动应用程序。 为了支持多种语言,我创建了一个名为“exchange”的对象,其中包含变量的翻译,其中“exchange”包含200多个变量。 我的问题是,在性能的规模上,最好用的是什么:

对象内的1-变量如下:

var exchange = {
    USERNAME_PASSWORD_UNMATCHED: "الاسم و كلمة المرور غير متطابقين",
    NOT_APPROVED: " بانتظار تأكيد صلاحية الوصف",
    ERROR_CONNECT: "فشل الاتصال بالخادم",
    RE_LOGIN: "الرجاء اعادة الدخول",
    INVALID_ACCESS_TOKEN: "رمز المرور غير صحيح",
.
.
.
};

像这样的函数内的2-变量

 var exchange = {
    get_variable:function(name){
    switch(name){
        case "USERNAME_PASSWORD_UNMATCHED": return "الاسم و كلمة المرور غير متطابقين"; break;
        case "NOT_APPROVED":return " بانتظار تأكيد صلاحية الوصف";
        case "ERROR_CONNECT":return "فشل الاتصال بالخادم";
        case "RE_LOGIN":return "الرجاء اعادة الدخول";
        case "INVALID_ACCESS_TOKEN":return "رمز المرور غير صحيح";
    }
}
    };

1 个答案:

答案 0 :(得分:2)

我认为,对于像你提供的简单的js结构,两者之间的差异很小。虽然,我更喜欢解决方案#1而不是#2,因为它更简单(对我而言)并且易于访问。

我还用jsperf跟踪了两者的表现,实际上没有区别。

您可以在此处查看结果:jsperf-exchange-translation-perf

以下是用于测试的代码:

<强>制备

// Keys
var keys = [
   "USERNAME_PASSWORD_UNMATCHED",
   "NOT_APPROVED",
   "ERROR_CONNECT",
   "RE_LOGIN",
   "INVALID_ACCESS_TOKEN"
];

// Random number between keys range
var getRandomKey = function() {
    return Math.floor(Math.random() * ((keys.length - 1) - 0 + 1)) + 0;
};

测试案例#1:

var exchange = {
    USERNAME_PASSWORD_UNMATCHED: "الاسم و كلمة المرور غير متطابقين",
    NOT_APPROVED: " بانتظار تأكيد صلاحية الوصف",
    ERROR_CONNECT: "فشل الاتصال بالخادم",
    RE_LOGIN: "الرجاء اعادة الدخول",
    INVALID_ACCESS_TOKEN: "رمز المرور غير صحيح"
};

for(var i = 0; i < 10000; i++) {
   console.log(exchange[getRandomKey()]);
}

测试案例#2:

var exchange = {
    get_variable:function(name){
    switch(name){
        case "USERNAME_PASSWORD_UNMATCHED": return "الاسم و كلمة المرور غير متطابقين"; break;
        case "NOT_APPROVED":return " بانتظار تأكيد صلاحية الوصف"; break;
        case "ERROR_CONNECT":return "فشل الاتصال بالخادم"; break;
        case "RE_LOGIN":return "الرجاء اعادة الدخول"; break;
        case "INVALID_ACCESS_TOKEN":return "رمز المرور غير صحيح";
    }
    }
};

for(var i = 0; i < 10000; i++) {
   console.log(exchange.get_variable(getRandomKey()));
}

<强>结果:

测试案例#1:

2.51 ops/sec

测试案例#2:

2.46 ops/sec

特别说明:因为我使用了console.log等。有可能jsperf将根据执行测试的CPU的流量返回不同的结果。多次运行测试表明存在很大的差异。

所以我最后会说,解决方案的 access 性能没有太大区别,但使用#1 解决方案#2 会有意义,因为后者只会使对象值的检索变得复杂,默认情况下使用exchange["USERNAME_PASSWORD_UNMATCHED"]

在javascript中很容易