是什么让PHP比Java或C#慢?

时间:2009-09-10 20:40:17

标签: php language-design

这是我一直想知道的:为什么PHP比Java或C#慢,如果这三种语言都被编译成字节码然后从那里执行?我知道通常PHP会根据每个请求重新编译每个文件,但即使你将APC(字节码缓存)带入图片中,性能也远不及Java或C#(尽管APC大大改进了它)。

编辑: 我甚至没有在网络层面谈论这些语言。我在谈论他们数字运算时的比较。甚至不包括启动时间或类似的东西。

另外,我不是根据这里的回复作出某种决定。 PHP是我的首选语言;我只是对它的设计感到好奇。

8 个答案:

答案 0 :(得分:39)

其中一个原因是PHP中缺少JIT编译器,正如其他人所提到的那样。

另一个重要原因是PHP的动态类型。动态类型语言总是比静态类型语言慢,因为在运行时而不是编译时检查变量类型。因此,像C#和Java这样的静态类型语言在运行时会明显更快,尽管它们通常必须提前编译。 JIT编译器使得动态类型语言不再是一个问题,但唉,PHP没有内置的(虽然请参阅Facebook的HHVM以获取PHP的第三方JIT示例。)

答案 1 :(得分:9)

我猜你在这里比较了苹果和橘子 - 假设你使用所有这些语言来创建Web应用程序,它还有很多不仅仅是语言。 (很多时候,数据库正在减慢你的速度; - )

我绝不会建议在 speed 参数的基础上选择其中一种语言。

答案 2 :(得分:5)

Java和C#都有JIT compilers,它接受​​字节码并编译成真正的机器代码。编译它的行为可能需要一些时间,因此C#和Java可能会受到较慢的启动时间的影响,但是一旦代码被JIT编译,其性能就像任何“真正编译”的语言(如C ++)一样。

答案 3 :(得分:4)

最大的原因是Java的HotSpot JVM和C#的CLR都使用即时(JIT)编译。 JIT编译将字节码编译为直接在处理器上运行的本机代码。

此外,我认为Java字节码和CIL比PHP的内部字节码低,这可能使JIT优化更容易,更有效。

答案 4 :(得分:2)

一个疯狂的猜测可能是JAVA依赖于某种“应用程序”服务器,而PHP则不然 - 这意味着每次调用PHP页面时都必须创建一个新的环境。

(当PHP被用作CGI,而不是作为Apache模块或通过FastCGI时,尤其如此)


另一个想法可能是C#和JAVA编译器可以在编译时进行一些重要的优化 - 另一方面,因为PHP脚本是编译的(至少,如果你没有“欺骗”操作码缓存)< / em>每次调用页面时,编译阶段必须快速;这意味着不可能花太多时间进行优化。


仍然:每个版本的PHP通常会带来一些改进的性能;例如,当从PHP 5.2切换到5.3时,您可以获得15%到25%的CPU。

例如,看看那些基准:


另外一个重要的事情是,PHP很容易扩展:只需添加几个Web服务器,瞧!

从1到多个服务器时经常遇到的问题是会话 - 将它们存储在DB或memcached (非常简单)中,问题解决了!


作为旁注:我不建议选择一项技术,因为某些基准测试的速度差异有几个百分点:还有更重要的因素,比如你的团队对每种技术的了解程度 - 或者甚至是你的算法打算用!

答案 5 :(得分:0)

在琐碎的条件下,解释语言无法比编译语言甚至JIT语言更快。

除非您的测试程序包含打印出“Hello Worlds”,如果您关注速度,请坚持使用C#或Java。

答案 6 :(得分:-2)

取决于你想做什么。在某些情况下,PHP肯定更快。 PHP(非常)擅长文件操作和其他基本的东西(也是XML的东西)。在这些情况下,Java或C#可能会更慢(尽管我没有基准测试)。

此外,PHP输出(HTML或其他)需要下载到浏览器,这也耗费时间。

此外,Java / C#的速度在很大程度上取决于它运行的机器(可能是多个)。 Java / C#可能在您的计算机上运行缓慢,而PHP只在一台可用的服务器上运行,并且始终与服务器一样快(下载时间除外)。

我不认为它们在一般方面具有可比性。我认为您需要完成一项任务,您可以使用这三种编程语言完成这项任务,然后进行比较。这基本上总是在选择编程语言时应该做的事情;找到适合任务的那个。在适合编程语言之前,不要塑造任务。

答案 7 :(得分:-3)

根据wikipedia,PHP使用The Zend Enginedoes not have一个JIT