
课程咨询: 400-996-5531 / 投诉建议: 400-111-8989
认真做教育 专心促就业
潍坊it培训小编跟大家讨论为什么要优化?
或许你会问,「慢加密」不就是希望计算更慢吗,为什么还要去优化?
假如这是一个自创的隐蔽式算法,并且混淆到外人根本无法读懂,那不优 化也没事。甚至可以在里面放一些空循环,故意消耗时间。
但事实上,我们选择的肯定是「密码学家推荐」的公开算法。它们每一个 操作,都是有数学上的意义的。
原本一个操作只需一条 CPU 指令,因为不够优化,用了两条指令,那么额 外的时间就是内耗。导致用时更久,强度却未提升。
2.前端计算软肋
如果是本地程序,根本不用考虑这个问题,交给编译器就行。
但在 Web 环境里,我们只能用浏览器计算!相比本地程序,脚本要慢的 多,因此内耗会很大。
脚本为什么慢?主要还是这几点:
弱类型
解释型
沙箱
3.弱类型
脚本,是用来处理简单逻辑的,并不是用来密集计算的,所以没必要强类 型。
不过如今有了一个黑科技:asm.js。它能通过语法糖,为 JS 提供真正的强 类型。
这样计算速度就大幅提升了,可以接近本地程序的性能!
但是不支持 asm.js 的浏览器怎么办?例如,国内还有大量的 IE 用户,他们 的算力是非常低的。
好在还有个后补方案————Flash,它有各种高性能语言的特征。类 型,自然不在话下。
相比 asm.js,Flash 还是要慢一些,但比 IE 还是快多了。
4.解释型
解释型语言,不仅需要语法分析,更是失去了「编译时深度优化」带来的 性能提升。
好在 Mozilla 提供了一个可以从 C/C++ 编译成 asm.js 的工具:emscriptn。
有了它,就不用裸写了。而且编译时经过 LLVM 的优化,生成的代码质量 会更高。
事实上,这个概念在 Flash 里早有了。
曾经有个叫 Alchemy 的工具,能把 C/C++ 交叉编译成 Flash 虚拟机指 令,速度比 ActionScript 快不少。
Alchemy 现在改名 FlasCC,还有开源版的 crossbridge
5.沙箱
一些本地语言看似很简单的操作,在沙箱里就未必如此。例如数组操作:
vector[k] = v
虚拟机首先得检查索引是否越界,否则会有严重的问题。
如果「前端慢加密」算法涉及到大量内存随机访问,那就会有很多无意义 的内耗,因此得慎重考虑。
不过有些特殊场合,脚本速度甚至能超过本地程序!例如开头提到的 MD5 大量反复计算。
这其实不难解释:
首先,MD5 算法很简单。没有查表这样的内存操作,使用的都是局部变 量。局部变量的位置都是固定的,避免了越界检查开销。
其次,emscripten 的优化能力,并不比本地编译器差。
最后,本地程序编译之后,机器指令就不会再变了;而如今脚本引擎,都 有 JIT 这个利器。它会根据运行时的情况,实时生成更优化的机器指令。
所以选择加密算法时,还得兼顾实际运行环境,扬长避短,发挥出最大功 效。