js获取歌曲时长_万万没想到:对JS代码混淆,竟造成这样的性能损失?

12168772c429ee12f20793bcfeb5d5a5.png

我们知道,如果要对JS代码进行保护,最普遍的做法是进行混淆加密。

很多人会有担忧:混淆加密后,会不会造成性能影响?JS混淆会带来多少性能损失?

ff568f5ddb01b6c2f86faa286b81f5c4.png

理论而言,混淆加密会使JS 代码量增加,那么执行时理应有性能影响。

重点是:会带来多少性能损失,是否会严重影响执行效率?

为了验证这一问题,本文通过实测的方式寻求真相,揭示JS混淆加密究竟会带来多少性能影响。

准备

1、JS代码混淆加密,使用JShaman代码保护平台,这是国内知名的商业JS代码混淆服务平台。

实验使用JShaman的通用版保护。

2、验证性能影响,我们使用console.time()和console.endtime()方法,在node环境下执行,通过打印出代码执行时间,比较混淆前后的执行时间差,得出具体的影响结果。

为了分别验证不同代码量下的影响情况,实验将分三次进行,分别使用少量代码、中等代码量、大量代码。

实验一、小量代码测试

准备一小段代码,并运行,如下:

5ca99668b542a8823328aa82cea3dae4.png

把上述代码,提交到JShaman平台进行混淆。

注:使用默认的混淆选项,后面的测试也都使用此相同配置:

00c7f39a257832c578823050d74853bc.png

混淆后,代码量增加了不少:

9ce83e35b7da4a4c3076fdc119fedb96.png

再次运行,如下:

4bac59fa1174bc6f106ebfe0a4c3ed6f.png

混淆后代码执行时间慢了约0.2毫秒。带来的性能影响基本可忽略。

实验二、中量代码测试

写一个功能代码,用于获取CPU使用率:

ed2a659172c199e299ef5a46179481de.png

用同样的方式,经JShaman对代码进行混淆,再次运行测试:

9eaf236b873fc39c70222d3bba51cb5d.png

惊人的一幕发生了:混淆后的代码执行效率竟然更高?!真是令人难以置信,所以不敢相信的连续运行了三次,然而三次运行结果都比混淆前更快。

注:如上图,混淆前,代码执行时长:1045.935毫秒。混淆后,三次运行时长都小此此值。

为什么会发生这种情况?混淆后代码量增大了,执行效率反而提升了?

粗略的猜想:是由于混淆的过程,对数据进行了优化,将数据统一命名,又对执行顺序(AST树)进行了优化?

带着疑惑,继续进行测试。

实验三、大量代码测试

由于是测试,虽说要大量代码,但不会真太多,是相对上面两组代码而言。

这里使用base64算法进行测试,代码量160多行。

e7a670ef1607c12a505e878a08f15d8f.png

还是用相同的方式,通过JShaman对其混淆:

2ec877ff29360d74d885917bce6972f3.png

混淆后运行:

18221e05dcb8fb875ee7707553d93802.png

可以看到,运行时长在16.8毫秒到21.1毫秒之间。比之前的13.7毫秒慢了2.9到8.4毫秒之间。

感觉慢一些才是合理的,不惊慌、也不奇怪。这组的性能损失完全能接受。

到此,感觉测试结果跟想像的很不同,本以为混淆会带来很大的性能影响才对。疑惑感更重了,为此,再加一组测试,将JShaman的混淆强度提高:

8631b0e0dedb89d2d4da585fad04dab3.png

这个混淆强度已很高,已经达到了商用级,可以满足绝大多数的保护要求。

再次混淆,可以看到这个强度的混淆后,文件已经由6K增大到了24K,体积的增加,说明代码量增大了,代码量增大后,运行速度应该会很受影响吧?

555c4e88686c022634d4382440bd62cb.png

运行,看结果:

97d26a0f86e36b1da121b29aa753115f.png

代码执行时长仅在约18毫秒到23秒之间。又一次令人意外!这个效能是完全可以接受的。

总结:

说实话,这个测试结果着实令人意外。本以为混淆会严重影响执行性能。而实验结果证明:少量的代码混淆,几乎是不会带来执行性能损失。大量的代码混淆,确实带来一定的性能影响,但其影响很小,是完全可以接受的。

那么,当我们有比较重要的JS代码在公开发布、或提供给他人时,使用混淆加密是种很好的代码保护方案,可以有效的防止分析、复制、盗用等,而且不必太担心性能影响问题。

前端JS、app、h5、后端nodejs代码,都是可以用的噢。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值