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