最近项目里,为了方便错误消息捕捉进logs里面
我用了一大堆try catch
然后,突然想起来try catch可能会消耗性能
网上找了个帖子,说是以前阿里用来测试的
设计实验方式
简单的设计方案也就是对比实验。
空白组1:[无 try catch 的情况下对数据取模1千万次耗时]
?
!function() {
//无try catch的情况耗时
var t = new Date();
//耗时代码开始
for (var i = 0; i < 100000000; i++) {
var p = i % 2;
}
//耗时代码结束
document.write(new Date() - t);
}();
参照组2:[将耗时代码用 try 包围,内联耗时代码]
?
!function() {
//在 try 中内联代码的耗时情况
var t = new Date();
try{
//耗时代码开始
for (var i = 0; i < 100000000; i++) {
var p = i % 2;
}
//耗时代码结束
throw new Error();
}catch(e){
}
document.write(new Date() - t);
}();
参照组3:[将耗时代码用 try 包围,外联耗时代码]
?
!function() {
function run(){
//耗时代码开始
for (var i = 0; i < 100000000; i++) {
var p = i % 2;
}
//耗时代码结束
}
//在 try 中内联代码的耗时情况
var t = new Date();
try{
run();
throw new Error();
}catch(e){
}
document.write(new Date() - t);
}();
参照组4:[将耗时代码用 catch 包围,内联耗时代码]
?
!function() {
//在 catch 中内联代码的耗时情况
var t = new Date();
try{
throw new Error();
}catch(e){
//耗时代码开始
for (var i = 0; i < 100000000; i++) {
var p = i % 2;
}
//耗时代码结束
}
document.write(new Date() - t);
}();
参照组5:[将耗时代码用 catch 包围,外联耗时代码]
?
!function() {
function run(){
//耗时代码开始
for (var i = 0; i < 100000000; i++) {
var p = i % 2;
}
//耗时代码结束
}
//在 catch 中内联代码的耗时情况
var t = new Date();
try{
throw new Error();
}catch(e){
run();
}
document.write(new Date() - t);
}();
运行结果(只选取了 Chrome 作为示例)
Chrome44
不使用 try-catch |
try 中耗时,内联代码 |
try 中耗时,外联代码 |
catch 中耗时,内联代码 |
catch 中耗时,外联代码 |
98.2 |
1026.9 |
107.7 |
1028.5 |
105.9 |
我当时就慌得一笔,写了那么多代码还要改回来,差点就哭了
**然后我就在现在用的chrome 81里面跑了同样的代码
而结果是**
**Chrome81
不使用 try-catch |
try 中耗时,内联代码 |
try 中耗时,外联代码 |
catch 中耗时,内联代码 |
catch 中耗时,外联代码 |
69 |
67 |
66 |
61 |
61** |
**然后我又把循环次数加了10倍
耗时基本上是线性的增加了10倍**
**??????
chrome已经牛逼的彻底解决了try catch的性能问题了吗?
诸位认为呢?**
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…