`
jindw
  • 浏览: 508404 次
  • 性别: 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 休眠和唤醒

    调用`goToSleep`时,你需要传入一个参数,即休眠原因的标识码,这有助于系统追踪休眠的原因,例如`PowerManager.SLEEP_REASON_USER`表示用户手动触发的休眠。 `wakeUp`方法则是用于唤醒设备的。当设备处于休眠状态...

    关于zigbee中的休眠程序

    首先,我们要理解Zigbee的几种不同休眠模式:空闲模式(Idle)、休眠模式(Sleep)和深度休眠模式(Deep Sleep)。空闲模式是设备在不发送或接收数据时进入的状态,但仍能监听网络活动;休眠模式则进一步降低功耗,...

    Qt5.10检测系统休眠

    在开发跨平台应用程序时,有时候我们需要检测系统的状态,比如是否处于休眠或唤醒状态。Qt是一个强大的跨平台应用开发框架,支持多种操作系统,包括Windows、Linux、macOS等。在这个场景下,我们关注的是如何在Qt...

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

    标题中的“硬盘盒关闭自动休眠升级工具.zip”指出这是一个针对硬盘盒的软件工具,用于禁用硬盘的自动休眠功能。在IT领域,自动休眠是一种节能策略,旨在减少设备功耗,尤其是在长时间无操作时。然而,在某些场景下,...

    VB 代码 关机待机休眠

    VB 代码关机待机休眠 VB 语言是一种流行的编程语言,广泛应用于Windows 操作系统平台上。通过 VB 语言,我们可以实现各种功能强大的应用程序,包括关机、待机、休眠等操作。 在这个代码中,我们可以看到 VB 语言...

    S32K14x CAN休眠唤醒的实现

    S32K14x CAN休眠唤醒的实现 在本文中,我们将讨论S32K14x系列芯片的CAN休眠唤醒的实现方法。S32K14x系列芯片的CAN模块在普通模式下不支持休眠唤醒功能,但是在Pretended Networking模式下可以支持在STOP1和STOP2...

    Windows7 启动休眠模式 命令

    #### 三、休眠模式的优势与局限性 虽然休眠模式为用户带来了诸多便利,但它也存在一定的局限性。下面我们来分析一下它的优势与不足之处。 ##### 优势 1. **数据安全性**:即使在突然断电的情况下,数据也不会丢失...

    JMS567_设置休眠的方法(9528RU3)2139去休眠.zip

    需要注意的是,长期取消休眠可能会增加硬盘的温度,因此建议确保硬盘盒有良好的通风条件,以防止过热。此外,如果你的硬盘是7*24小时连续工作的,建议定期进行检查和维护,以确保其健康状态。 总的来说,JMS567硬盘...

    revosleep让你挂载的大硬盘休眠的工具

    这不仅有助于环保,还能延长硬盘的使用寿命,因为硬盘在休眠状态下其机械部件不会持续运转。重新唤醒硬盘也非常简单,只需要鼠标点击几下即可,无需每次使用前都手动插拔硬盘,极大地提高了使用便利性。 在IT领域,...

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

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

    SIM7600 Open Linux 休眠唤醒应用文档_V2.02.pdf

    根据提供的文档信息,我们可以深入探讨SIM7600模块在Open Linux系统下的休眠与唤醒机制。这份文档主要关注的是如何有效地控制SIM7600模块进入休眠状态以及如何从休眠状态中唤醒模块。下面将详细解析文档中提到的关键...

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

    标题中的“绿联ASM1153E芯片硬盘盒关闭休眠工具+教程”涉及到的主要知识点是关于硬盘盒硬件和软件优化的一个特定场景。这里我们可以深入解析一下相关的几个概念: 1. **绿联(UGREEN)**: 绿联是一家知名的消费类...

    JMS567_578设置休眠工具.rar

    标题中的“JMS567_578设置休眠工具.rar”暗示这是一款针对ORICO 3.5寸硬盘盒的休眠设置调整软件,主要用于管理设备的节能模式。这款硬盘盒,如ORICO 3588US3,通常会预设一个5分钟的休眠时间,即在无操作的情况下,...

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

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

    既可待机又可休眠的批处理文件

    在这个特定的案例中,我们有两个批处理文件,`suspend.bat` 和 `sleep.bat`,分别用于实现计算机的待机和休眠功能。 待机和休眠是Windows系统中的两种不同的电源管理模式,它们各自具有独特的特性和用途: 1. **...

    如何阻止Windows进入休眠状态?

    ### 如何阻止Windows进入休眠状态? 在日常工作中,我们可能会遇到这样的情况:正在运行一些重要的后台任务(如数据同步、文件传输等),但Windows系统却自动进入了休眠模式,导致这些任务被迫中断。为了防止这种...

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

    针对这种情况,绿联提供了一款专门的“关闭休眠”工具,旨在帮助用户禁用硬盘盒的自动休眠功能,以保持设备持续运行。 JMS578芯片是由JMicron公司开发的一款USB到SATA桥接控制器,它能够将传统的SATA硬盘转换为USB...

    SIM7600CE-T休眠唤醒手册

    本文档是关于SIM7600CE-T四代LTE通信模块在嵌入式物联网领域的休眠唤醒应用手册,主要面向使用SIM7600OpenLinux系统的开发者们。文档中详细讲解了模块的休眠唤醒机制、流程以及操作方法,适用于开发者进行二次开发,...

    防止系统休眠程序.zip

    总的来说,这个“防止系统休眠程序”利用AutoIt的脚本功能,为用户提供了避免计算机休眠的解决方案,尤其适用于有特定电源管理策略的环境。用户只需要运行程序,并按照说明操作,就能确保电脑在需要的时候保持活跃...

Global site tag (gtag.js) - Google Analytics