Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/288.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
C# 为什么jittedpython实现仍然很慢?_C#_Java_Python_Performance_Jit - Fatal编程技术网

C# 为什么jittedpython实现仍然很慢?

C# 为什么jittedpython实现仍然很慢?,c#,java,python,performance,jit,C#,Java,Python,Performance,Jit,我理解解释开销昂贵的原因,但为什么JITted Python实现(Psyco和PyPy)仍然比其他JITted语言(如C#和Java)慢得多 编辑:我也知道一切都是一个对象,动态类型是昂贵的,等等。但是,对于可以推断类型的函数,我不知道为什么这很重要。Python是一个很好的例子 这意味着其他静态语言(如C#和Java)在编译时所做的大部分工作都是在运行时完成的,这会降低性能 编辑: 此外,用于动态语言(如python)的JIT编译器可以对代码执行更少的优化,因为由于代码的动态性,它无法执行许多

我理解解释开销昂贵的原因,但为什么JITted Python实现(Psyco和PyPy)仍然比其他JITted语言(如C#和Java)慢得多

编辑:我也知道一切都是一个对象,动态类型是昂贵的,等等。但是,对于可以推断类型的函数,我不知道为什么这很重要。

Python是一个很好的例子

这意味着其他静态语言(如C#和Java)在编译时所做的大部分工作都是在运行时完成的,这会降低性能

编辑:
此外,用于动态语言(如python)的JIT编译器可以对代码执行更少的优化,因为由于代码的动态性,它无法执行许多假设

例如
动态类型防止对字段/变量/参数的类型进行假设,因此,任何涉及这一点的优化几乎是不可能的

EDIT2:
只是澄清一下:
当我说编译时,我指的也是JIT编译时,因为实际上JIT是一个编译器。

将这一点应用到我的第一句话中,可以得出Python在JIT时间执行的工作比C#或Java少得多…

这是一个非常好的问题。我不能给你一个完整的答案,但我认为其中一个原因是“一切都是物体,物体可以是任何东西”的概念。在Java中,如果尝试“1.getClass()”,除非先显式或隐式地将其装箱,否则它将无法工作。在Python中,它是开箱即用的。但对象肯定比Python似乎没有的基本类型更重

“对象可以是任何东西”这一部分更为重要。如果用Java编写“someobject.somefield”,它在编译时就知道什么是“somefield”,并生成直接访问它的代码。好吧,可能有一些技巧可以提供更好的二进制兼容性,但这与Python不同,Python实际上在运行时执行某种字典查找,以确定在特定时刻什么是“somefield”,因为可以动态添加和删除字段


简而言之,Python功能更强大,但这种功能是有代价的。

人们已经指出了技术细节,所以我将添加另一个因素:金钱

在过去几年中,Javascript虚拟机(谷歌的V8、Mozilla的Tracemonkey&Jaegermonkey、苹果的Nitro)为另一种动态语言带来了巨大的速度提升。这在很大程度上是由于谷歌希望使网络应用程序更强大。Python并没有一家大公司能够通过将其速度提高50倍而获益


哦,与C扩展(如numpy)的集成意味着速度对于Python代码来说并不重要。

您无法真正将动态语言与企业级静态语言进行比较。Sun在优化语言、VM和JIT方面花费了大量资金。微软在虚拟机方面也做得不错

比较jit动态语言更有趣。是JavaScript让谷歌的V8速度比两者都快,还是仅仅是一笔投资

我明白为什么要翻译 开销很贵


比较一下那些Python实现,再想想你的问题。

最简单的答案是PyPy还没有hotspot和Psyco那么快

编写一个合理的JIT是一个漫长而乏味的过程,例如hotspot花了很多年的时间才达到它的目标(也有很多资金)。语言越复杂、越动态,所需时间就越长。从好的方面来看,我们有一些很好的例子,动态语言的JIT可以非常快,以LuaJIT为例,它可以在许多例子中击败C或JVM


然而,也有好消息:根据PyPy的数据,在过去的100次修订中,平均速度提高了27%,因此最终会出现这种情况。

整个问题在2014年不再那么清楚了。谷歌的V8 JS引擎做了一些非常繁重的事情来优化JS

如果有足够的资金,PyPy可能会快得多。Python的执行速度基本上并不重要,因此没有人对PyPy进行大量投资

这真的不再是技术问题了。看看Java的InvokeDynamic指令。当然,这些调用在第一次调用时花费更多,但是一旦这些调用启动,JVM就可以发挥神奇的作用。也就是说:JVM可以进行假设,并且可以在运行代码时了解代码。如果一个方法总是返回一个int,那么这个方法可能总是返回一个int。实际上JVM做的更多

2014年,就性能而言,它实际上不是动态vs静态的。肯定的C++将始终是最快的工具,但是动态的语言不是像几年前那样慢的“幅度”。 再等几年,我打赌静态分析在2016年或2017年会更强。目前正在进行一些非常有趣的研究项目

理论上: 基本上,您可以使用静态类型分析推断每种类型,您必须在代码执行之前理解代码正在执行的操作。这不是不可能的

静态分析变得更强大时,您真的不再需要静态类型系统了。所有静态类型的系统,甚至haskell的,都限制了正确程序的数量。所以本质上:如果你有一个分析器,它可以通过分析来证明程序的正确性,那么它就比静态类型的系统强大得多,它只能在边界内运行。关于代码重用:没有什么能比得上动态键入

有一些人会说,动态类型对于大型应用程序来说是不好的,但是如果静态分析变得更强大,那么您实际上将拥有与静态类型系统相同或可能更为可靠的正确性