`
yiminghe
  • 浏览: 1466366 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

closure compiler 代码优化实例

 
阅读更多

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 后续会考虑加入

 

 

 

 

 

 

分享到:
评论
3 楼 RednaxelaFX 2012-01-10  
yiminghe 写道
不是龙/鲸书,找了本薄的复习下:http://detail.tmall.com/item.htm?id=15021680972&_u=9ba5ojmb784
RednaxelaFX 写道
话说这帖里引用的术语的参考来源是什么地方?

多谢,回头我也读读这本看写得如何
2 楼 yiminghe 2012-01-09  
不是龙/鲸书,找了本薄的复习下:http://detail.tmall.com/item.htm?id=15021680972&_u=9ba5ojmb784
RednaxelaFX 写道
话说这帖里引用的术语的参考来源是什么地方?
1 楼 RednaxelaFX 2012-01-09  
话说这帖里引用的术语的参考来源是什么地方?我读的资料里有好些术语都跟这里用的不一样。

引用
编译时计算(computation during compilation)

通常叫constant folding。也有时候被叫做partial evaluation但因为容易跟别的上下文里的别的用法弄混所以很少这么叫。

引用
无用代码消除 (useless code elimination)

通常叫dead code elimination吧

引用
循环不变量迁移(motion of loop invariant)

用词是对的,不过整个动作更常见的叫法是loop invariant code motion

相关推荐

    基于Java的实例源码-JS和CSS压缩混淆 JsCompressor.zip

    2. **混淆器**:混淆部分的代码可能使用类似于YUI Compressor或Google Closure Compiler的算法,将变量名和函数名替换为更短的、无意义的字符串,同时保持代码功能不变。 3. **输入输出处理**:为了能够处理多个...

    通过Java压缩JavaScript代码实例分享

    在实际项目中,更常见的是使用现成的库,如Google的Closure Compiler或UglifyJS,它们提供了更全面的压缩和优化功能,包括变量重命名、死代码消除等高级优化。 总的来说,通过Java实现JavaScript代码压缩是一个涉及...

    JS加密后可在网页上运行

    例如,使用第三方混淆工具如UglifyJS或Closure Compiler进行压缩和混淆。 2. **编码加密**:将JS代码转化为其他编码格式,如Base64,然后在页面加载时解码并执行。这样可以增加代码的保密性,因为直接查看源代码时...

    ajax调用java实例源码-jayq:jQuery的ClojureScript包装器

    ajax调用java实例源码杰克 ClojureScript 的 jQuery 包装器。 等一下.. 我以为我们不应该使用jQuery? 当 ClojureScript 首次出现时,普遍的看法是,由于 jQuery 与 Google Closure Compiler 不兼容,我们不应该使用...

    ts-design-patterns

    此外,"closure-compiler"标签提示我们,TypeScript设计模式也适用于Google的Closure Compiler,它可以对TypeScript代码进行优化,进一步提升代码性能。而TypeScript本身作为JavaScript的超集,它在设计模式的应用上...

    AJAX教程

    5.5 完成JavaScript压缩和模糊处理:使用工具如UglifyJS或Closure Compiler优化代码大小和性能。 5.6 使用Firefox的Web开发扩展:如Firebug、Web Console等,辅助开发和调试。 5.7 实现高级JavaScript技术:如...

    编译原理常用术语英汉对照表

    - **Code Optimizer(代码优化器)**:代码优化器改进目标代码,提高其效率和性能。 #### 6. 词法与语法元素 - **Token(词法单元)**:词法分析过程中产生的最小语法单位。 - **Symbol(符号)**:在编程语言中...

    jquery-ui-1.8.22.custom控件

    为了提高性能,可以使用压缩和合并工具(如Closure Compiler或Grunt/Gulp)将JS和CSS文件合并为单个文件,并进行压缩,减少HTTP请求次数。 总的来说,"jquery-ui-1.8.22.custom控件.zip" 包含了一个精简版的 ...

    seajs模块压缩问题与解决方法实例分析

    然而,在压缩代码时,传统的压缩工具(如YUICompressor,GoogleClosureCompiler)会对代码中所有的变量进行压缩,这就可能导致require关键字被替换成其他非标准的字符串,如文中提到的"abcdefg"。这样一来,在seajs...

    java开源包8

    开发它是用于在UTF-8 Oracle实例中使用ASCII编码的Oracle 数据库中来正确的传输非ASCII字符。 Java模板语言 Beetl Beetl,是Bee Template Language的缩写,它绝不是简单的另外一种模板引擎,而是新一代的模板引擎,...

    java开源包10

    开发它是用于在UTF-8 Oracle实例中使用ASCII编码的Oracle 数据库中来正确的传输非ASCII字符。 Java模板语言 Beetl Beetl,是Bee Template Language的缩写,它绝不是简单的另外一种模板引擎,而是新一代的模板引擎,...

    python面试题目-python-python经典面试题目-Python语言的基本概念-常用的功能和特性-编程范式-面试题目

    - `class`关键字定义类,`__init__`方法初始化对象,`self`引用实例本身。 15. **字典(Dictionary)与集合(Set)**: - 字典是键值对的无序容器,支持快速查找。 - 集合是不重复元素的无序集合,支持数学运算...

    java开源包1

    开发它是用于在UTF-8 Oracle实例中使用ASCII编码的Oracle 数据库中来正确的传输非ASCII字符。 Java模板语言 Beetl Beetl,是Bee Template Language的缩写,它绝不是简单的另外一种模板引擎,而是新一代的模板引擎,...

    java开源包2

    开发它是用于在UTF-8 Oracle实例中使用ASCII编码的Oracle 数据库中来正确的传输非ASCII字符。 Java模板语言 Beetl Beetl,是Bee Template Language的缩写,它绝不是简单的另外一种模板引擎,而是新一代的模板引擎,...

    java开源包3

    开发它是用于在UTF-8 Oracle实例中使用ASCII编码的Oracle 数据库中来正确的传输非ASCII字符。 Java模板语言 Beetl Beetl,是Bee Template Language的缩写,它绝不是简单的另外一种模板引擎,而是新一代的模板引擎,...

    java开源包6

    开发它是用于在UTF-8 Oracle实例中使用ASCII编码的Oracle 数据库中来正确的传输非ASCII字符。 Java模板语言 Beetl Beetl,是Bee Template Language的缩写,它绝不是简单的另外一种模板引擎,而是新一代的模板引擎,...

    java开源包5

    开发它是用于在UTF-8 Oracle实例中使用ASCII编码的Oracle 数据库中来正确的传输非ASCII字符。 Java模板语言 Beetl Beetl,是Bee Template Language的缩写,它绝不是简单的另外一种模板引擎,而是新一代的模板引擎,...

Global site tag (gtag.js) - Google Analytics