closure compiler
可以进行不少有意思的优化
,一般只有在编译器优化中才会出现的,比如:
编译时计算(computation during compilation)
优化前:
var x=5*11;
alert(x*Math.random());
优化后:
优化时进行直接量计算,得到:
var x=55;
alert(x*Math.random());
高级模式下,甚至直接消除没有显式导出的变量 x:
alert(55*Math.random());
复写传播( copy propagation)
优化前
var x=Math.random()+1;
var y=x;
alert(y*Math.random());
alert(y);
优化后
高级模式下,去除无意义的直接变量 copy 赋值以及未显式导出的 y,并替换所有使用 y 的地方为 x:
var a=Math.random()+1;alert(a*Math.random());alert(a);
无用代码消除 (useless code elimination)
上面的无用变量消除也算这一种,更广泛的应用是分支代码消除:
优化前:
if(1>2){ // if(debug)
alert(1);
}
优化后为:
但还有些没做的:
循环展开(loop unrolling)
优化前:
for(var i=0;i<3;i++){
alert(i);
}
优化后:
alert(1);
alert(2);
alert(3);
更好些,不过考虑到大多数循环代码比较长,以及 closure compiler 的重点在于减少代码体积,这点没加也是应该。
循环不变量迁移(motion of loop invariant)以及代码提升(code hoisting)
优化前:
var c=Math.random(),d=Math.random(),x=Math.floor(Math.random()*2);
switch(x){
case 0:
alert(c*d);
break;
case 1:
alert(c*d);
break;
}
var i,c=Math.random(),d=Math.random(),j;
for(var i=0;i<10;i++){
j=c*d+10;
}
期待优化后:
var c=Math.random(),d=Math.random(),x=Math.floor(2*Math.random()),t=c*d;switch(x){case 0:alert(t);break;case 1:alert(t)};
var i,c=Math.random(),d=Math.random(),j,t=c*d;for(i=0;10>i;i++)j=t+10;
实际优化:
var c=Math.random(),d=Math.random(),x=Math.floor(2*Math.random());switch(x){case 0:alert(c*d);break;case 1:alert(c*d)};
var i,c=Math.random(),d=Math.random(),j;for(i=0;10>i;i++)j=c*d+10;
即将重复的 c*d 不变量提取出来。
虽然写出上述代码是程序员的责任,但工具如果能帮忙优化下显然会更好,希望 closure compiler 后续会考虑加入
。
分享到:
相关推荐
Java圆形按钮实例代码,含注释 两个目标文件,自绘button。 Java圆形电子时钟源代码 1个目标文件 内容索引:JAVA源码,系统相关,电子钟 用JAVA编写的指针式圆形电子钟,效果图如下所示,其实代码很简单,希望对你有...
Java圆形按钮实例代码,含注释 两个目标文件,自绘button。 Java圆形电子时钟源代码 1个目标文件 内容索引:JAVA源码,系统相关,电子钟 用JAVA编写的指针式圆形电子钟,效果图如下所示,其实代码很简单,希望对你有...
ajax调用java实例源码杰克 ClojureScript 的 jQuery 包装器。 等一下.. 我以为我们不应该使用jQuery? 当 ClojureScript 首次出现时,普遍的看法是,由于 jQuery 与 Google Closure Compiler 不兼容,我们不应该使用...
开发它是用于在UTF-8 Oracle实例中使用ASCII编码的Oracle 数据库中来正确的传输非ASCII字符。 Java模板语言 Beetl Beetl,是Bee Template Language的缩写,它绝不是简单的另外一种模板引擎,而是新一代的模板引擎,...
开发它是用于在UTF-8 Oracle实例中使用ASCII编码的Oracle 数据库中来正确的传输非ASCII字符。 Java模板语言 Beetl Beetl,是Bee Template Language的缩写,它绝不是简单的另外一种模板引擎,而是新一代的模板引擎,...
开发它是用于在UTF-8 Oracle实例中使用ASCII编码的Oracle 数据库中来正确的传输非ASCII字符。 Java模板语言 Beetl Beetl,是Bee Template Language的缩写,它绝不是简单的另外一种模板引擎,而是新一代的模板引擎,...
开发它是用于在UTF-8 Oracle实例中使用ASCII编码的Oracle 数据库中来正确的传输非ASCII字符。 Java模板语言 Beetl Beetl,是Bee Template Language的缩写,它绝不是简单的另外一种模板引擎,而是新一代的模板引擎,...
开发它是用于在UTF-8 Oracle实例中使用ASCII编码的Oracle 数据库中来正确的传输非ASCII字符。 Java模板语言 Beetl Beetl,是Bee Template Language的缩写,它绝不是简单的另外一种模板引擎,而是新一代的模板引擎,...
开发它是用于在UTF-8 Oracle实例中使用ASCII编码的Oracle 数据库中来正确的传输非ASCII字符。 Java模板语言 Beetl Beetl,是Bee Template Language的缩写,它绝不是简单的另外一种模板引擎,而是新一代的模板引擎,...
开发它是用于在UTF-8 Oracle实例中使用ASCII编码的Oracle 数据库中来正确的传输非ASCII字符。 Java模板语言 Beetl Beetl,是Bee Template Language的缩写,它绝不是简单的另外一种模板引擎,而是新一代的模板引擎,...
开发它是用于在UTF-8 Oracle实例中使用ASCII编码的Oracle 数据库中来正确的传输非ASCII字符。 Java模板语言 Beetl Beetl,是Bee Template Language的缩写,它绝不是简单的另外一种模板引擎,而是新一代的模板引擎,...
开发它是用于在UTF-8 Oracle实例中使用ASCII编码的Oracle 数据库中来正确的传输非ASCII字符。 Java模板语言 Beetl Beetl,是Bee Template Language的缩写,它绝不是简单的另外一种模板引擎,而是新一代的模板引擎,...
开发它是用于在UTF-8 Oracle实例中使用ASCII编码的Oracle 数据库中来正确的传输非ASCII字符。 Java模板语言 Beetl Beetl,是Bee Template Language的缩写,它绝不是简单的另外一种模板引擎,而是新一代的模板引擎,...
开发它是用于在UTF-8 Oracle实例中使用ASCII编码的Oracle 数据库中来正确的传输非ASCII字符。 Java模板语言 Beetl Beetl,是Bee Template Language的缩写,它绝不是简单的另外一种模板引擎,而是新一代的模板引擎,...
开发它是用于在UTF-8 Oracle实例中使用ASCII编码的Oracle 数据库中来正确的传输非ASCII字符。 Java模板语言 Beetl Beetl,是Bee Template Language的缩写,它绝不是简单的另外一种模板引擎,而是新一代的模板引擎,...
开发它是用于在UTF-8 Oracle实例中使用ASCII编码的Oracle 数据库中来正确的传输非ASCII字符。 Java模板语言 Beetl Beetl,是Bee Template Language的缩写,它绝不是简单的另外一种模板引擎,而是新一代的模板引擎,...