我只是javascript的初学者。我需要类似于C ++ map的东西。所以,我用了这个 -
var map = new Object();
map['key'] = 'value';
虽然它运作良好,但我对表现不满意。我用大约100000条数据集测试它需要很长时间。您能否提出更好的解决方案来改善绩效?
答案 0 :(得分:3)
以下是您所看到的内容。听起来你是一个不熟悉JS的C ++人,因此我将向您介绍一些基础知识,我们将结束一个很好的演示。
1)地图不是你正在做的事情的术语。
使用单词map会让一些人感到困惑,因为在JS中,map is actually a function在一个数组上可以用来改变它的数据形状。你正在做的是创建一个对象。 Javascript对象是动态的,因此动态添加属性是完全合理的,这是您的情况的前提。您想要为动态对象添加许多属性。
2)没有例子,你的问题很模糊
很难解读在机器上运行“需要很长时间”的内容。这是服务器端JS还是客户端?你有没有使用酷炫的新多核东西?您是在创建100,000个对象还是仅向单个对象添加100,000个属性?作为一个C ++人,你应该知道要比这更模糊。创建一个对象会分配内存,而C ++中的每个人都知道内存分配很重。因此,一点信息可以产生巨大的差异。
3)JS的速度比C ++慢
周期。 C ++是一种低级语言。为了自动为您做事(比如分配内存),更高级别的语言本质上更慢。这更不用说浏览器带来的开销了。
4)大多数优化都不在您手中
除非您使用二进制文件(注意:不是汇编,二进制),否则您正在使用的命令将由软件解释。那个翻译的速度不是你可以产生巨大影响的东西。作为一个轻量级示例,客户端JS受浏览器速度,用户处理器速度,用户和服务器网络协调速度,请求数量,AJAX调用滞后时间甚至是用户在给定时间在其计算机上执行的其他操作的数量。
5) 慢。让我们看看一些真实的数据点。
下面你会看到它不到1/10秒(在我的机器上)可以为一个对象添加100,000个属性,而只是稍微慢一些(仍然不到1/10秒)来创建100,000个对象并为每个对象添加1个属性。
我们通过将其记录到控制台来增加时间(几乎每秒2/10),但即使这不是我们的错,也不是您应该在优化代码中遇到的事情。
警告,运行此代码小部件将为您的浏览器提供少量密码
var start = new Date().getTime();
var obj1 = {};
for (var i = 0; i < 100000; ++i) {
obj1[i.toString()] = 'test';
}
var end = new Date().getTime();
var time1 = end - start;
console.log(obj1);
end = new Date().getTime();
var time2 = end - start;
start = new Date().getTime();
for (var i = 0; i < 100000; ++i) {
var obj2 = {};
obj2[i.toString()] = 'test';
}
end = new Date().getTime();
var time3 = end - start
console.log(time1);
console.log(time2);
console.log(time3);
答案 1 :(得分:-2)
这是相同的:
var map = {};
map.key = 'value';