Mr_*_*uet 28 javascript optimization
在技术采访中的另一天,问题之一是"你如何优化Javascript代码"?
令我惊讶的是,他告诉我,虽然循环通常比循环更快.
这是真的吗?如果是,那为什么呢?
Chr*_*rie 35
你应该反驳一个负面的while循环会更快!请参阅:JavaScript循环性能 - 为什么将迭代器减少到比递增更快的速度.
在同时与对,这两个源文件速度的现象相当不错的毫秒运行在不同的浏览器不同的回路并比较结果: https://blogs.oracle.com/greimer/entry/best_way_to_code_a和: HTTP:// WWW .stoimen.com/blog/2012/01/24/javascript-performance-for-vs-while /.
从概念上讲,for循环基本上是一个封装的while循环,专门用于递增或递减(根据某种顺序或某个长度在逻辑上前进).例如,
for(var k=0; ++k; k< 20){ ... }
可以通过使其成为负循环来加速:
var k = 20;
while(--k){ ... };
正如您从上面链接中的测量结果中可以看到的那样,节省的时间确实会增加非常大的数字.
Bri*_*lis 15
虽然这是对速度和效率的微小检测的一个很好的答案,但我不得不离开@Pointy原始声明.
正确的答案是,担心这样的细节通常是没有意义的,因为您在进行此类优化时所做的任何努力都可能因下次登录V8或SpiderMonkey而完全浪费
由于Javascript是客户端确定的,并且最初必须针对每个浏览器进行编码以实现完全跨浏览器兼容性(在ECMA甚至涉及之前更糟糕),由于显着优化,速度差异在此时甚至可能不是合乎逻辑的答案并在浏览器及其编译器引擎上采用Javascript.
我们甚至没有谈论非严格的脚本只能编写诸如GAS中的应用程序,因此虽然答案和问题很有趣,但它们很可能在实际应用程序中比实用更简单.
要阐述这个主题,首先需要了解这个主题最初的来源和编译与解释.让我们简要介绍语言的演变历程,然后再回到编译与解释.虽然不需要阅读,但您可以阅读Compiling vs Interpeting以获得快速答案,但为了深入理解,我建议您阅读编译与解释和编程的演变(显示它们如何应用于今天).
编译语言编码是一种编程方法,您可以用编译器理解的可编译方式编写代码,今天一些更公认的语言是Java,C++和C#.编写这些语言的目的是编译器程序然后将代码转换为目标机器使用的机器代码或字节码.
解释的代码
 
是处理后的码Ĵ乌斯我 Ñ Ť在执行时IME(JIT)没有首先编译,它跳过此步骤并允许更快编写,调试,添加/变更等也绝不会存储脚本的解释供将来使用,每次调用方法时它都会重新解释脚本.解释的代码在定义的和预期的程序运行时环境(对于javascript通常是浏览器)中运行,然后由环境解释然后输出到期望的结果.解释过的脚本永远不会成为独立的软件,并且总是希望插入一个有效的运行时环境来进行解释.这就是脚本不可执行的原因.他们永远不会直接与操作系统通信.如果查看发生的系统进程,您将永远不会看到正在处理脚本,而是看到正在处理的程序正在其运行时环境中处理脚本.
因此,在Javascript中编写一个hello脚本意味着浏览器解释代码,定义hello是什么,当发生这种情况时,浏览器将此代码转换回机器级代码,说我有这个脚本,我的环境想要显示单词hello so然后,机器将其处理为脚本的可视化表示.这是一个持续的过程,这就是为什么在计算机中安装处理器以及在系统上进行持续处理的原因.没有什么是静态的,无论情况如何,都会不断地执行流程.
编译器
 
通常将代码编译为定义的字节码系统或机器代码语言,现在是代码的静态版本.除非重新编译源代码,否则机器不会重新解释它.这就是为什么在编译后会看到运行时错误的原因,然后程序员必须在源代码中调试并重新编译.解释器预期的脚本(如Javascript或PHP)只是在运行之前未编译的指令,因此可以轻松编辑和修复源代码,而无需额外的编译步骤,因为编译是实时完成的.
并非所有编译代码都是平等的
 
一个简单的方法来说明这是视频游戏系统.Playstation与Xbox.构建Xbox系统以支持.net框架以优化编码和开发.C#将此框架与公共语言运行时结合使用,以便将代码编译为字节码.字节码不是编译代码的严格定义,它是进程中的一个中间步骤,允许更快地编写代码并在程序上更大规模地编写代码,然后在运行时执行代码时解释,您猜对了Ĵ乌斯我 ñ Ť IME(JIT).区别在于此代码只被解释一次,一旦编译,程序将不再重新解释该代码,除非重新启动.
解释的脚本语言永远不会编译代码,因此解释脚本中的函数不断被重新处理,而编译的字节码的函数被解释一次并且指令被存储直到程序的运行时停止.好处是,只要您拥有必要的资源,字节码就可以移植到另一台机器的架构中.这就是为什么您必须在系统中安装.net以及可能的更新和框架才能使程序正常工作的原因.
Playstation不为其机器使用.net框架.您需要使用C++编写代码,C++应针对特定的系统体系结构进行编译和汇编.代码将永远不会被解释,并且需要完全正确才能运行.你永远不能轻易地移动这种类型的语言,就像你可以使用中间语言.它专门针对该机器的架构而制定,绝不会以其他方式解释.
因此,您甚至看到编译语言本身并不是编译语言的最终版本.编译语言的严格定义是完全编译使用.解释语言应该由程序解释,但也是编程中最便携的语言,因为只需要安装了理解脚本的程序,但由于不断被解释,它们也使用最多的资源.中间语言(例如Java和C#)是这两种语言的混合体,部分编译但也需要外部资源才能保持功能.一旦运行,然后再次编译,这是在运行时的一次解释.
机器代码编码
 
的最低形式,这个代码在其表示中是严格二进制的(我不会进入三元计算,因为它基于理论和本讨论的实际应用).计算机了解自然值,开/关真/假.这是机器级数字代码,它与下一级汇编代码不同.
汇编代码
 
直接下一级代码是汇编语言.这是语言被解释为由机器使用的第一个点.此代码用于解释随后以机器级代码发送到计算机的助记符,符号和操作数.这一点很重要,因为当你第一次开始编程时,大多数人都会做出假设,无论是编译还是解释都是这个或那个意思.除了低级机器代码之外,没有编码语言可以只编译指令或只解释指令! 
我们在"Not Not Compiled Code is Created Equal"中对此进行了讨论.汇编语言是第一个这样的例子.机器代码是机器读取的内容,但汇编语言是人类可以阅读的内容.随着计算机处理速度的加快,通过更好的技术进步,我们的低级语言开始变得更加精简,不需要手动实现.汇编语言曾经是高级编码语言,因为它是编码机器的更快捷的方法.它本质上是一种语法语言,一旦组装(最低版本的编译)直接转换为机器语言.汇编程序是编译器,但并非所有编译器都是汇编程序.
高级编码
 
高级编码语言是比汇编高出一步的语言,但甚至可能包含更高级别的语言(这将是字节码/中间语言).这些语言从定义的语法结构编译成所需的机器代码,要解释的字节码或前一种方法的混合,以及允许内联编写汇编的特殊编译器.像它的前身Assembly那样的高级编码旨在减少开发人员的工作量,并消除冗余任务中出现严重错误的任何可能性,例如构建可执行程序.在今天的世界中,你很少会看到一个开发人员在组装过程中为了处理数据而单独使用大小.比开发人员更常出现这种情况,例如在视频游戏控制台开发中,他们需要在此过程中提高速度.因为高级编码编译器是寻求简化开发过程的工具,所以它们可能不会100%以最有效的方式为该系统架构编译代码.在这种情况下,将编写汇编代码以最大化系统的资源.但你永远不会看到一个人用机器码编写,除非你遇到一个怪人.
如果你做到这一点,恭喜你!你只是一次性地听了一遍,而不是我的妻子,关于这些东西,一辈子.OP的问题是关于while和for循环的性能.这是今天标准中没有实际意义的原因是双重的.
原因一
 
解释Javascript的日子已经一去不复返了.所有主流浏览器(是的,甚至是Opera和Netscape)都使用Javascript引擎来编译脚本,然后再实现它.JS开发人员在非调用方法方面讨论的性能调整是在查看语言中的本机函数时过时的研究方法.在成为DOM的一部分之前,代码已经针对该代码进行了编译和优化.当该页面启动时,它不再被解释,因为该页面是运行时环境.Javascript实际上已成为一种中间语言,而不是解释脚本.它永远不会被称为中间脚本语言的原因是因为Javascript永远不会被编译.这是唯一的原因.除此之外,它在浏览器环境中的功能是Bytecode所发生的缩小版本.
原因二 你编写一个脚本或脚本库的机会几乎是不可能的,这些脚本或脚本库需要与网站上的桌面应用程序一样多的处理能力.为什么?因为Javascript从未创建过,意图成为一种包罗万象的语言.它的创建只是提供一种中等水平的语言编程方法,允许完成HTML和CSS不提供的流程,同时减轻开发难以要求专用的高级编码语言,特别是Java.
大多数早期的Web开发都不支持CSS和JS.直到1997年,CSS并不是一个安全的集成,而且JS的战斗时间更长.除HTML之外的所有内容都是网络世界中的补充语言.
HTML特定于作为站点的构建块.你永远不会写javascript来完全构建一个网站.最多你会做DOM操作但是建立一个站点.
你永远不会在JS中设计你的网站,因为它不实用.CSS处理该进程.
除了暂时使用Javascript,你永远不会存储.你使用的是数据库.
那么我们剩下的是什么呢?越来越多的功能和流程.CSS3及其未来的迭代将采用Javascript的所有样式方法.你看到已经有动画和伪状态(悬停,活动等).
此时Javascript中代码优化的唯一有效参数是编写错误的函数,方法和操作,可以通过优化用户的公式/代码模式来帮助它们.只要您学习正确有效的编码模式,Javascript在当今时代就不会失去其原生函数的性能.
| 归档时间: | 
 | 
| 查看次数: | 20870 次 | 
| 最近记录: |