实测 对数字字符串转成数字的效率比较
发布于 9 年前 作者 captainblue2013 7615 次浏览 最后一次编辑是 8 年前 来自 分享

代码:

var a = '1' ;
for (var i = 0; i < 100000000; i++) {
	parseInt(a);  //方案一
	// a * 1;   //方案二
}
console.log(process.uptime());

结果,单位秒: 方案一: 1.559 , 1.492 , 1.523 方案二:3.841 , 3.899 , 3.877

19 回复

parseint是内置的方法 自豪地采用 CNodeJS ionic

我习惯 a - 0

用 parseInt 时要加上第二个参数,除非有特定用途。可以试试 parseInt(xxx, 10)。

哇塞,长经验了。我一般情况下也是使用方案一,当然是只知道第一种方法而已。不过我记得方案二的做法应该会涉及到字符串对象和数字对象的转换,故比较耗时

process.uptime()不适合做基准测试吧:)

方案二是分了两个步骤:

  1. 先把a转换成Number类型
  2. 进行算术运算(*) 这肯定比较耗时了。

直接Number呢?

这种测试有何意义?假设你的程序是普通 web 应用,单进程能每秒响应 100w 次?

@luinlee 看了,第二个参数默认是10

@dayuoba 那应该用哪个比较好?

@captainblue2013 process.uptime是进程运行的时间,这个时间包含进程开始初始化等等过程,显然是不合理的。 高精度的process.hrtime,精确到纳秒。

@captainblue2013 不是的,比较一下 parseInt(‘0x10’) 和 parseInt(‘0x10’, 10)。然后再比较一下 parseInt(xxx, 10) 和 parseInt(xxx) 的性能。

@captainblue2013 我自己一般用

console.time('number bench')
//benchmark here
console.timeEnd('number bench')

@luinlee

var a = '1';
var b = '0x1';

var runTest = function(timeTag, testFunction) {
	console.time(timeTag);
	for (var i = 0; i < 100000000; i++) {
		testFunction(); //a);
	}
	console.timeEnd(timeTag);
}

//runTest("parseInt", parseInt);
runTest("parseInt(a)", function() {
	parseInt(a);
});
runTest("parseInt(a, 10)", function() {
	parseInt(a, 10);
});
runTest("parseInt(b)", function() {
	parseInt(b);
});
runTest("parseInt(b, 10)", function() {
	parseInt(b, 10);
});
runTest("* 1", function() {
	a * 1;
});
runTest("- 0", function() {
	a - 0;
});


Result:

parseInt(a): 1550ms
parseInt(a, 10): 1422ms
parseInt(b): 6517ms
parseInt(b, 10): 5716ms
* 1: 3914ms
- 0: 3903ms

为什么我觉得这样 +'1' 是最常用的。。。

@alsotang 就是把字符串的数字转为数字呀,比如 ‘1.11’-0 就可以转成数字了,这个比parseInt只能转整数通用一些。。。

回到顶部