Javascript:无意中的性能浪费

本文属于《Javascript基础纪要

今天在看一个模板引擎的源码里,发现一个函数:

1
2
3
4
5
function regexpLiteral(source) {
        return source.replace(/[\^\[\]\$\(\)\{\}\?\*\.\+]/g, function (c) {
            return '\' + c;
        });
    }

这函数本来没有问题。但在用于模板引擎中,在解析模板语法的过程中,可能大量调用,此时就会有一个潜在问题——或者说,可以优化之处:

函数中给replace传入了一个正则表达式,是直接使用正则表达式字面量传入的,而这实际上相当于,每次执行这个函数,都会创建一个正则表达式。

如果对代码执行效率有极端变态的需求,通常作法是将需要重复使用的东西缓存起来。我提供两种方式,如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
  var reg = /[\^\[\]\$\(\)\{\}\?\*\.\+]/g;
  function regexpCache(source) {
          return source.replace(reg, function (c) {
              return '\' + c;
          });
      }

  var regexpClosure = function (reg) {
      return function (source) {
              return source.replace(reg, function (c) {
                  return '
\' + c;
              });
          }    
  }(/[\^\[\]\$\(\)\{\}\?\*\.\+]/g);

后者用了闭包,反正就是将正则缓存起来。

经测试,上述3个方法,取所有浏览器平均水平,第3个(即闭包那个)效率最高。可查看jsperf上的benchmark

不过,在chrome中,上述3个几乎没有差距,甚至有时候第1个最快,这只能说chrome的JS引擎V8优化做得真的很不错

发表评论

电子邮件地址不会被公开。