【问题标题】:What makes PHP slower than Java or C#?是什么让 PHP 比 Java 或 C# 慢?
【发布时间】:2009-09-10 20:40:16
【问题描述】:

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

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

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

【问题讨论】:

  • 这已经接近火焰战争的领域了。最好将其标记为主观
  • 这是一个很好的问题,绝对不是主观的或争论的。值得更多的信任 IMO。

标签: php language-design


【解决方案1】:

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

另一个重要原因是 PHP 的 动态类型。动态类型语言总是比静态类型语言慢,因为变量类型是在运行时而不是编译时检查的。因此,像 C# 和 Java 这样的静态类型语言在运行时会明显更快,尽管它们通常必须提前编译。 JIT 编译器可以减少动态类型语言的问题,但遗憾的是,PHP 没有内置的。 (编辑:PHP 8 将带有一个内置的 JIT 编译器。)

【讨论】:

  • 那么动态类型肯定会让 JIT 编译和一般运行时优化更有趣!
  • PHP 字节码缓存有很大帮助,因为它们本质上是在缓存源 -> 字节码翻译,但没有从字节码 -> 机器码的缓存或优化翻译。它只是在更基本的层面上得到解释。
  • 字节码缓存仍然无法解决动态类型问题。正如你所说,字节码仍然需要被解释。所以它仍然无法与静态类型、编译、JIT 化的语言竞争。
  • 现在有一个用于 PHP (github.com/facebook/hhvm) 的 JIT 编译器,所以动态类型的问题,而现在仍然没有对性能的影响。老实说,两种技术之间的性能比较每天都变得越来越边缘化。两者之间的最大差异是开发和基础设施成本。但这是一个不同的线程;-)
【解决方案2】:

我猜您在这里比较苹果和橙子有点兴趣 - 假设您使用所有这些语言来创建 Web 应用程序,那么除了语言之外还有很多其他内容。 (而且很多时候是数据库让你慢了下来;-)

我绝不会建议根据 速度 论点选择其中一种语言。

【讨论】:

  • +1 速度大部分时间是关于代码编写的好坏,而不是关于在愚蠢的基准测试中测量的速度的相对差异。优秀的开发人员可以让这些平台中的任何一个飞起来。
  • 我没有选择语言。 PHP 是我选择的语言(至少对于网络而言)。我只是好奇。
  • 真正造成速度差异的不是语言,而是它们(编译的)代码的执行方式。正如其他人所提到的,java 和 .NET 虚拟机已经调整得很好,它/可能/是 php 的执行方式没有优化。如果这是一个理论/语言限制,或者只是为 php 家伙做的工作问题,可能还有待商榷。 (看到最近javascript性能的提升我觉得还是可以加快php执行速度的)
【解决方案3】:

Java 和 C# 都有JIT compilers,它获取字节码并编译成真正的机器码。编译它的过程可能需要时间,因此 C# 和 Java 的启动时间可能会变慢,但是一旦代码被 JIT 编译,它的性能与任何“真正编译”的语言(如 C++)处于同一水平。

【讨论】:

  • +1 你的答案和我的基本一样。我不明白为什么它应该被否决
【解决方案4】:

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

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

【讨论】:

    【解决方案5】:

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

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


    另一个想法可能是 C# 和 JAVA 编译器可以在编译时进行一些重度优化——另一方面,编译 PHP 脚本 (至少,如果你不使用操作码缓存“作弊”) 每次调用页面时,编译阶段都必须非常快;这意味着不可能花太多时间进行优化。


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

    例如,看看那些基准:


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

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


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

    【讨论】:

      【解决方案6】:

      在微不足道的条件下,解释语言不可能比编译语言甚至 JIT 语言更快。

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

      【讨论】:

      • 现在没有解释或编译语言这样的东西!
      【解决方案7】:

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

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

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

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

      【讨论】:

      • 你的比较没有多大意义。 OP 询问简单、原始的数字运算性能,以及为什么 PHP 中的方法会比 Java/C# 中的相同方法慢。
      • 嗯,它没有多大意义,因为很难进行比较。另一个可能不令人满意的比较是问“为什么是梨毛衣然后是苹果?”。它们都是水果(就像 PHP/Java 都是编程语言),但这个问题并没有真正的答案,因为它们差别很大。
      • 我不同意。你可以清楚地解释为什么梨比苹果更甜(如果你足够了解你的水果)。这些语言可能有不同的用途,但这不应该阻止您将它们并排比较。
      【解决方案8】:

      根据wikipedia,PHP 使用The Zend Engine,其中does not haveJIT

      【讨论】:

      • 现在 PHP 支持 JIT(Just In Time) 编译。
      猜你喜欢
      • 2012-02-19
      • 1970-01-01
      • 1970-01-01
      • 2013-08-21
      • 2015-10-04
      • 2011-11-14
      • 2012-05-01
      • 2012-06-02
      • 2023-03-20
      相关资源
      最近更新 更多