`
jindw
  • 浏览: 501427 次
  • 性别: Icon_minigender_1
  • 来自: 初到北京
社区版块
存档分类
最新评论

休眠一年有余的JSA,优势依然

阅读更多
JSA是一个大概在2006年底开发的JS分析压缩工具,最初出现的时候相比同类产品,优势明显。
后来出现了yuicompressor,风光不再了,两者貌似压缩比例差距很小。都已经接近了语法压缩的极限。

无聊一下,分析一下相比YUI,JSA到底还有拉些优势呢,这可得用专业的眼光:

JSA 压缩结果
function group1(){var A;function $($,_){return $+_+$;}function _(){var _,A,$;function B($,_){return $+_+$;}}}function group3(){var B,_,$;function A($,_){return $+_+$;}}


YUI压缩结果
function group1(){var a;function b(e,d){return e+d+e}function c(){var e,h,g;function f(i,d){return i+d+i}}}function group3(){var c,a,d;function e(f,b){return f+b+f}};


查一下大小:JSA是168,YUI是166字节,怎么搞的,JSA怎么可能比YUI低呢?仔细一看,YUI是开启了语法补全的选项。
晕,跟我玩阴的!你是鸡蛋碰石头。

吧JSA “删除多余括弧”这个选项打开。165字节,差距太小了。

应该吧脚本搞复杂一点:
function group1(){var A;function $($,_){return $+_+$}function _(){var _=1,A=2,$;function B($,_){return $+_+$}}}function group3(){var B=1,_=2,$;function A($,_){return $+_+$}}

function group1(){var a;function b(e,d){return e+d+e}function c(){var e=1;var h=2;var g;function f(i,d){return i+d+i}}}function group3(){var c=1;var a=2;var d;function e(f,b){return f+b+f}};


结果是173->190
优势明显一点了。

将结果zip处理一下:85/106
优势进一步加大。

这些数据大家可能会觉得晕了,好了,我现在就解释一下产生这些差异的原因吧。

总结
1。语法优化上的优势:
   YUI在转换优化等价语法,去处可兼容语法,导致语法压缩结果本身差距,如合并var、如删除多余括弧,分号等,这方面能力相比JSA还有较大差距。
2。JSA也更有利于Gzip压缩
JSA 在变量重用的算法更好,对于类似的语法结构能翻译成相同的结果。
如函数“function $($,_){return $+_+$}”  JSA中三次出现相同结构,结果都翻译成相同的文本,而YUI是没有做到这点。
根据文本压缩的原理,只有重复率更高,才能达到更好的gzip压缩结果。


分享到:
评论
30 楼 toney_kissinger 2009-06-26  
像EXTJS这类的大家伙,再怎么压都一样。太大了。页面加载太慢。
29 楼 javaii 2009-06-18  
试了下,感觉很好,只是有些js文件压缩后会出错,唉。。。
28 楼 ithero 2009-06-16  
JSA对prototype压缩确实会出问题。不过楼主功底深厚。很是佩服
27 楼 damoqiongqiu 2009-06-15  
这么好的东西,可惜了啊!
26 楼 mlw2000 2009-06-14  
有点生气,虽然本人技术不敢说很好,但也不至于白痴到这种地步,不要总用消极的想当然的态度设想别人,OK,网络上不是所有人都是懒的不可救药
25 楼 mlw2000 2009-06-14  
jindw 写道
...任何一个人都没有时间跑你家中去调试你的代码。


哈哈,没有任何让你帮忙调代码的意思,
以前那个代码环境是N久前的版本了.......

我第一次的回帖只是想告诉你“某某人遇到过不兼容的情况”,但这种情况我现在无法给你给出一个详细的bug描述,仅此而已。

强调一下:我还没到那种“依靠别人调代码的龌龊地步”,希望你也不用把每个人都假设的那么龌龊,虽然网络上“完全自动不动脑筋,要求别人贴出完整代码的人”N多。
24 楼 Army 2009-06-13  
之前我还记得在你博客里提过另外一个可优化地方:

var s = "xxxxx" + "yyyyyy" + "zzzzzzzz";

=>

var s = "xxxxxyyyyyyyzzzzzzzz";

这个估计又麻烦也没啥效率,跨行字符串倒是ok。
23 楼 andot 2009-06-13  
JSA很好很强大,我一直用它。
22 楼 jindw 2009-06-12  
mlw2000 写道
jindw 写道
mlw2000 写道

prototype1.6压缩后出错有没有解决?


不记得了,新版本的JSA实现默认没有启用语法空白压缩,应该不会有问题了。
另外,出现问题之后,最好自己分析一下原因,否则谁也没这么多经历去给你debug。


-----------------------------------------------------------------
sorry,可能我的话有点让人误解,
我一直是用ant配合JSA来压缩js文件的(因为比较了流行的几中压缩工具,JSA的压缩率最高,比YUI高很多,这也是我不用YUI的原因),所以没有指责的意思。

之前一直用prototype 1.5(文本压缩后很小) ,现在代码换成了Mootools。
在比较几款JS压缩程序的过程中,尝试过用JSA去压缩prototype1.6(启用文本压缩),压缩过之后程序会报“找不到$函数”的错误。

开源的精神就在于更多的人去参与和完善软件,所以我只是想对JSA提出兼容性的问题,希望JSA能更好。


ps:码了太多字,;-)

我应该没有误解你的话,只是你的问题我一头雾水,你应该向Army学习,反馈最有价值的信息,任何一个人都没有时间跑你家中去调试你的代码。
21 楼 jindw 2009-06-12  
Army 写道
比如说mootools中有段源代码这样写,定义了个reg:/[\x00-\x1f\\"]/g。

editplus中高亮是错误的,会认为字符串没有结束,实际上这个语法可以通过。

用jsa压缩下,不带删除括号,压缩成为:/[\x00-\x1f\\\"]/g,反而多了一个\,但其实这是比较严谨的做法。

如果要删除括号的话,就是原样:/[\x00-\x1f\\"]/g。

另外像/"[^"\\\n\r]*"/等不删除括号的压缩都会对特殊符号加上转义符:/\"[^"\\\n\r]*"/,而删除括号等都会去掉。

这个其实算不上是bug……只是放进去看起来比较爽而已……



很好,下次可以考虑吧这点正则优化加上去。
20 楼 Army 2009-06-12  
比如说mootools中有段源代码这样写,定义了个reg:/[\x00-\x1f\\"]/g。

editplus中高亮是错误的,会认为字符串没有结束,实际上这个语法可以通过。

用jsa压缩下,不带删除括号,压缩成为:/[\x00-\x1f\\\"]/g,反而多了一个\,但其实这是比较严谨的做法。

如果要删除括号的话,就是原样:/[\x00-\x1f\\"]/g。

另外像/"[^"\\\n\r]*"/等不删除括号的压缩都会对特殊符号加上转义符:/\"[^"\\\n\r]*"/,而删除括号等都会去掉。

这个其实算不上是bug……只是放进去看起来比较爽而已……
19 楼 mlw2000 2009-06-12  
jindw 写道
mlw2000 写道

prototype1.6压缩后出错有没有解决?


不记得了,新版本的JSA实现默认没有启用语法空白压缩,应该不会有问题了。
另外,出现问题之后,最好自己分析一下原因,否则谁也没这么多经历去给你debug。


-----------------------------------------------------------------
sorry,可能我的话有点让人误解,
我一直是用ant配合JSA来压缩js文件的(因为比较了流行的几中压缩工具,JSA的压缩率最高,比YUI高很多,这也是我不用YUI的原因),所以没有指责的意思。

之前一直用prototype 1.5(文本压缩后很小) ,现在代码换成了Mootools。
在比较几款JS压缩程序的过程中,尝试过用JSA去压缩prototype1.6(启用文本压缩),压缩过之后程序会报“找不到$函数”的错误。

开源的精神就在于更多的人去参与和完善软件,所以我只是想对JSA提出兼容性的问题,希望JSA能更好。


ps:码了太多字,;-)
18 楼 鹤惊昆仑 2009-06-12  
nihongye 写道
我们实际的代码1.5MB,jsa+deflate下来,只有129kb,算下来0.0848,十分之一不到

原来这么生猛!得看看。。
17 楼 jindw 2009-06-12  
Army 写道
我只知道perl正则风格非规范写法会有问题。我压moo都手动修改加几个/,在editplus里面看一下就知道了,后半部全被高亮成字符串了。


Army能否详细描述一下,我看看有时间就修复一下。
16 楼 Army 2009-06-12  
我只知道perl正则风格非规范写法会有问题。我压moo都手动修改加几个/,在editplus里面看一下就知道了,后半部全被高亮成字符串了。
15 楼 jindw 2009-06-11  
mlw2000 写道
楼主,
请问prototype1.6压缩后出错有没有解决?
我给你发过站内消息。。。


不记得了,新版本的JSA实现默认没有启用语法空白压缩,应该不会有问题了。
另外,出现问题之后,最好自己分析一下原因,否则谁也没这么多经历去给你debug。
14 楼 mlw2000 2009-06-11  
楼主,
请问prototype1.6压缩后出错有没有解决?
我给你发过站内消息。。。
13 楼 turionboy 2009-06-11  
都是牛人,学习
12 楼 nihongye 2009-06-11  
jindw 写道
nihongye 写道
我们实际的代码1.5MB,jsa+deflate下来,只有129kb,算下来0.0848,十分之一不到


1.5M
不简单啊,呵呵,偷偷问一下,是什么工程呢?

在extjs上构建的一堆应用程序,断断续续到现在写了一年多快2年了
11 楼 jindw 2009-06-11  
Zehee 写道
JSA压缩的时候好像喜欢用$做替代,恐怕会和不少框架冲突吧。



错,JSA这点上绝对比你想象中聪明!

相关推荐

    android原生设置休眠添加永不休眠选项

    资源为代码patch,主要修复设置-显示-休眠中无永不休眠选项。为防止语言资源导致报错,重新在arrays添加选项,永不休眠原理只是将时间设置为Integer.MAX_VALUE

    防止硬盘休眠,防止硬盘自动断电批处理程序。

    移动硬盘有休眠功能的朋友的福音!硬盘插上电脑后,看下移动硬盘盘符,先在c盘新建一个yes.txt记事本文件,然后用记事本打开下载的批处理文件如下: :noparms (c盘文件的位置)(移动硬盘位置) if exist yes.txt ...

    51单片机的休眠模式

    51单片机的休眠模式

    android 休眠和唤醒

    利用PowerManager中 goToSleep和wakeUp方法实现手机强制休眠和唤醒,demo已测试通过

    Rockchip 休眠唤醒 开发指南 V0.1-20160729

    瑞芯技术 Rockchip 休眠唤醒 V0.1-20160729

    防止屏保或休眠(NoSleep)

    防止计算机进入屏保或休眠状态,可以指定时间段有效。

    android休眠与唤醒驱动流程分析

    android休眠与唤醒驱动流程分析 android wakelock 休眠 唤醒

    Qt5.10检测系统休眠

    Qt5.10 或Mac检测系统休眠,PC和Mac均通过。 貌似在Qt5上都适用

    Windows电脑休眠文件

    是一个可执行文件,可通过自定义快捷键(见本人教程https://blog.csdn.net/qq_43476358/article/details/118851355),给Windows休眠设置快捷键达到使windows可以"一键"休眠的效果.程序员有的时候累到极致,晃动下鼠标...

    vc关机待机休眠代码

    待机与休眠的区别 1、待机”电源管理模式 待机模式主要用于节电,该功能使你可不需重新启动计算机就可返回工作状态。待机模式可关闭监视器和硬盘、风扇之类设备,使整个系统处于低能耗状态。在你重新使用计算机时,...

    android 让某个应用保持不休眠的方法

    在正常情况下,Android系统会让程序和服务进入休眠状态以节约...然而在开发Android程序时,有时候在程序运行的时候,不能让系统休眠,否则有一些运行会停止,因此我们需要设置禁止休眠。文档里面有两种方法,紧供参考。

    如何实现ZigBee休眠与唤醒

    zigbee低功耗,休眠,唤醒 zigbee低功耗,休眠,唤醒

    联想工程师专用小工具 启用或禁用电脑休眠工具V4.01.1

    联想工程师专用小工具 启用或禁用电脑休眠工具V4.01.1联想工程师专用小工具 启用或禁用电脑休眠工具V4.01.1联想工程师专用小工具 启用或禁用电脑休眠工具V4.01.1联想工程师专用小工具 启用或禁用电脑休眠工具V4.01.1...

    给XP系统设置休眠 保存工作场景

    找回Windows XP SP2的“休眠” 通常情况下,当我们单击开始菜单中的“关闭计算机”时,关机界面中并不会显示“休眠”按钮,而是仅显示如图1所示的待机、关闭、重新启动这三个按钮。如果你希望在关闭计算机时显示...

    Android系统的休眠

    Android系统的休眠,组合代码介绍了几种休眠和唤醒的流程。

    关于W7休眠问题.doc

    有人说我不喜欢休眠,我要直接关机。那我们就把“休眠”消失…… 在运行里输入:powercfg.exe /hibernate off即可 END 小知识 睡眠(Sleep):切断除内存的其它设备的供电,数据都还在内存中。需要少量电池来维持...

    绿联JMS578芯片硬盘盒关闭休眠工具+教程

    绿联JMS578芯片硬盘盒关闭休眠工具+教程

    关于zigbee中的休眠程序

    适用于基于zigbee协议的应用中关于休眠的一段示范代码

    Qt Windows 休眠唤醒信号

    Qt Windows 休眠唤醒信号

    硬盘盒关闭自动休眠升级工具.zip

    这是绿屏 硬盘盒子 的休眠方法 , 为了解决游戏一卡一卡的问题,不少游戏采用的按需加载游戏资源的方法,因此硬盘老是休眠,游戏就会一卡一卡的。 让我很不爽, 因此,需要禁用的朋友们。不要错过了。

Global site tag (gtag.js) - Google Analytics