Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JIT-ed JavaScript比Java慢吗?_Javascript_Performance_Jit - Fatal编程技术网

JIT-ed JavaScript比Java慢吗?

JIT-ed JavaScript比Java慢吗?,javascript,performance,jit,Javascript,Performance,Jit,JIT编译的JavaScript(比方说在V8引擎上,因为它可能是最快的)执行速度是否比以前编译为字节码的托管语言(例如Java或.NET语言)慢 如果是,为什么 我的意思是,我理解JavaScript与字节码相比需要更多的时间来解析,但是在编译成机器码之后,它们应该表现得同样好,因为所有这些语言在功能方面都是相似的…简而言之,JavaScript和Java是非常不同的语言。静态类型的编译语言(如Java/C)在编译时有一个额外的优化步骤,生成的字节码已经针对目标体系结构进行了优化,这是一个巨大

JIT编译的JavaScript(比方说在V8引擎上,因为它可能是最快的)执行速度是否比以前编译为字节码的托管语言(例如Java或.NET语言)慢

如果是,为什么


我的意思是,我理解JavaScript与字节码相比需要更多的时间来解析,但是在编译成机器码之后,它们应该表现得同样好,因为所有这些语言在功能方面都是相似的…

简而言之,JavaScript和Java是非常不同的语言。静态类型的编译语言(如Java/C)在编译时有一个额外的优化步骤,生成的字节码已经针对目标体系结构进行了优化,这是一个巨大的优势,如果你问我的话,它会大大减轻运行时的负担

执行Javascript的引擎(例如V8或Chakra)在运行时需要做更多的工作,它们对对象的结构、随时间变化的预期行为等进行了大量的假设/猜测,而内联、缓存和其他执行优化要困难得多。Javascript语言的动态特性、多态对象的广泛使用和其他特性在这里确实是一个问题。然而,如果您了解这些引擎的内部结构,您可以做很多事情来优化代码

关于Javascript和Java之间的实际运行时性能,基准测试是您最好的朋友。正如@Elliot Frisch所建议的,您可以选择一个示例算法,并使用用于JS的V8命令行工具和用于Java的Java命令行进行测量


您可能会发现,在某些场景中,V8执行的JS与Java(甚至是C++)比较接近,但对于其他场景,速度要慢得多,这完全取决于特定于代码的优化、目标的特定运行时以及其他因素。组合的数量是巨大的,所以你找不到一个单一的答案。

首先,我想强调的是,没有办法给你这个问题一个精确的答案。在某些情况下,在JIT虚拟机(如V8或SpiderMonkey)上执行的JavaScript程序的性能可能优于在JVM上执行的用Java编写的等效程序。当然也有相反的情况[1]

其次,字节码本身不太可能对运行时性能有任何重大影响。事实上,类似于JVM的现代热点最终会将字节码转换为内部中间表示(IR),以实现优化的遵从性,就像V8对JavaScript源代码所做的那样

Java和JavaScript之间的关键区别在于类型信息的可用性(请注意,这是两种语言之间的根本区别,而不是它们的实现!)。由于Java是静态类型的,编译器在编译时知道每个变量*的类型。这意味着像
a+b
这样的表达式表示唯一的操作(例如整数或浮点加法),而在JavaScript中,它也可以表示任何数量的其他内容(例如字符串串联)。这意味着JavaScript JIT需要生成代码来测试所有可能的正确和不正确的类型组合,除非它能够以某种方式证明
a
b
始终具有某些特定类型

当然,问题不仅仅局限于原始类型。例如,JavaScript表达式
foo.bar
的计算结果应该是什么?它取决于
foo
中的值的类型,该类型在编译时未知;一个幼稚的实现将对象表示为哈希表,并在引用属性时执行查找(不用说,这将非常缓慢)。在Java中,如果
foo
是某个类的实例,该类声明了一个公共实例变量
bar
,那么编译器只需在距离内存中对象起始点的恒定偏移量处生成一个加载

在当代JavaScript实现中,似乎最普遍的补救措施是内联缓存(IC),这一概念在[2]中给出了比我希望提供的更好的解释。由于内联缓存可用于收集可提供给优化编译器的类型信息,因此JavaScript程序完全有可能赶上Java程序,只要出现在每个程序点的类型集小且稳定

[1] 有关几个示例,请参阅。在撰写本文时,HotSpot在大多数基准上都优于V8

[2]


(*)它知道每个变量的静态类型。当然,如果您的函数采用类型为
Object
的参数,那么在JavaScript中进行推理几乎与非类型变量一样困难,但是可以对其执行的操作集要小得多(例如,Java中没有
Object+Object

它高度依赖于它所运行的VM。Javascript本身就是一种允许数百万种可能的实现的语言。这个问题非常广泛,很可能会被解决。但请注意,有些引擎(如Chakra)仍然将Javascript编译成字节码,然后将字节码编译成机器码,这个问题一般来说是不可能回答的。如果没有一个算法在两种语言中尽可能高效地实现,然后与许多平台上的性能进行比较,这个问题是无法回答的。简言之,谎言,该死的谎言和统计数字。。。但是请阅读@mrpyo——实际上,所有这些语言在功能方面并不相似。