Javascript 性能:对象内变量与函数内变量

Javascript 性能:对象内变量与函数内变量,javascript,performance,Javascript,Performance,我正在使用javascript创建一个混合移动应用程序。 为了支持多种语言,我创建了一个名为“exchange”的对象,其中包含变量的翻译,其中“exchange”包含200多个变量。 我的问题是,在性能等级中,最好使用什么: 1-对象内部的变量,如下所示: var exchange = { USERNAME_PASSWORD_UNMATCHED: "الاسم و كلمة المرور غير متطابقين", NOT_APPROVED: " بانتظار تأكيد

我正在使用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 "رمز المرور غير صحيح";
    }
}
    };

我认为,对于您提供的简单js结构,两者之间的差异是最小的。尽管如此,我还是更喜欢解决方案1而不是解决方案2,因为它(在我看来)更简单,也更容易访问

我还跟踪了这两个项目的表现,几乎没有什么不同

您可以在此处查看结果:

以下是用于测试的代码:

准备:

// 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;
};
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()]);
}
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()));
}
2.51 ops/sec
2.46 ops/sec
测试用例#1:

// 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;
};
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()]);
}
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()));
}
2.51 ops/sec
2.46 ops/sec
测试用例#2:

// 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;
};
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()]);
}
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()));
}
2.51 ops/sec
2.46 ops/sec
特别注意:因为我使用了
console.log
等。jsperf可能会根据执行测试的CPU的流量返回不同的结果。多次运行测试表明存在很大的差异


因此,我最后要说的是,解决方案的访问性能没有多大差别,但是使用解决方案#1而不是#2是有意义的,因为后者只会使对象值的检索复杂化,在javascript中,使用
交换[“USERNAME\u PASSWORD\u UNMATCHED”]

您自己分析过吗?如果没有,为什么不呢?试试看。测试一下。发布你的结果。这是唯一的方法第一件事被称为“对象属性”,第二件事使用字符串文字。您使用的唯一变量是
exchange
name
。还请注意,在第二个示例中有一个语法错误,它应该是
get\u variable:function(name){
;而那些
返回后中断
是不必要的。这取决于你想要什么。如果你想要低内存使用率,但更高的CPU使用率,那么使用版本2。如果你想要低CPU使用率,但稍高一点的内存使用率,那么使用版本1。你检查一次吗?然后使用版本2。你经常使用这个吗?然后保存你自己CPU周期和使用版本1。我会使用对象属性。通过函数还原静态值没有意义。在考虑执行速度之前,除非您尝试每秒访问这些值60次,甚至可能在那之后,还有十几件事情需要首先处理。感谢您的回答,请注意,我正在使用此代码在移动应用程序上,因此10%的成本非常高。再次感谢