`
yiminghe
  • 浏览: 1461449 次
  • 性别: 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上百实例源码以及开源项目源代码

    Java右键弹出菜单源码 简单 Java圆形按钮实例代码,含注释 两个目标文件,自绘button。 Java圆形电子时钟源代码 1个目标文件 内容索引:JAVA源码,系统相关,电子钟 用JAVA编写的指针式圆形电子钟,效果图如下所示,...

    基于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的缩写,它绝不是简单的另外一种模板引擎,而是新一代的模板引擎,...

Global site tag (gtag.js) - Google Analytics