如果我使用 PHP Web 框架(例如 CodeIgniter)编写一个 hello world 应用程序,然后我编译它并使用 HipHop 运行它。它会比我在 django 或 rails 中编写相同的 hello world 应用程序运行得更快吗?
6 回答
HIPHOP将php代码转换成C++代码,需要编译运行。由于预编译的代码运行得更快并且使用的内存更少,因此像 python/php 这样的脚本语言在您给出的示例中可能会运行得更快。
但是,HIPHOP 不会转换所有代码。php 中的许多代码是动态的,不能更改为 c++,这意味着您必须在编写代码时牢记这一点。是否甚至可以使用 HIPHOP 编译 codeigniter 是另一个问题。
Terry Chay 写了一篇关于 HIPHOP 的大文章,涵盖了何时使用它、它的局限性和未来。我建议阅读这篇文章,因为它很可能会回答你的大部分问题,并让你深入了解它是如何工作的 :)
在这一点上,运行时间是无关紧要的。HipHop 是为扩展而设计的……意味着数十亿的请求。即使是中等规模的网站,也绝对不需要使用 HipHop 之类的东西。
但更重要的是你的问题......我认为没有可供我们查看的比较图表,但我怀疑在那个级别上运行时间会更快。
我不了解 django 或 rails,所以这有点离题。
使用纯 php,请求转到 apache,然后转到 mod_php。mod_php 从磁盘加载 helloworld.php 脚本,对其进行解析和标记,将其编译为字节码,然后解释字节码,将输出传递回 apache,apache 将其提供给用户。
使用 php 和优化器,第一次运行与普通 php 大致相同,但编译后的源代码存储在 ram 中。然后,对于第二个请求:转到 apache,apache 到 mod_php,apc 从 ram 加载字节码,对其进行解释,将其传递回 apache,再返回给用户。
hiphop 没有 apache,但 hiphop 本身没有解释器,所以请求直接发送到 hiphop 并返回给用户。所以是的,它更快,因为几个原因:
- 启动速度更快,因为不需要编译字节码——程序已经是机器可读的代码。所以没有按请求编译,也没有源文件读取。
- 没有翻译。机器代码不一定更快 - 这取决于源翻译的质量(嘻哈)和静态编译器的质量(g++)。与手写 c 代码相比,hiphop 翻译的代码并不快,因为类型处理等原因会产生一些开销。
使用 node.js,也没有 apache。脚本启动并直接编译为机器代码(因为 V8 编译器会这样做),所以它是一种 AOT(提前)编译(或者它仍然称为 JIT?我真的不知道)。然后每个请求都由已经编译的机器代码直接处理;所以node.js其实和hiphop很相近。我假设 hiphop 是多线程的或类似的东西,而 node 确实事件 IO。
facebook 声称速度提高了 50%,但实际上并没有那么多;如果你比较语言枪战的结果,你会看到各种算法的执行速度,php 慢了 5 到 250 倍。
那为什么只有50%?因为 ...
- Web 应用程序不仅仅依赖于执行速度,例如 IO
- php 的类型系统阻止 hiphop 充分利用 c++ 的静态类型
- 在实践中,很多 php 已经是 C,因为大部分功能要么是内置的,要么来自扩展。扩展是用 C 语言编程并静态编译的。
我不确定 hello world 是否有巨大的性能提升,因为 hello world 即使有一个好的框架,与所有其他开销(网络延迟和其他东西)相比,执行速度仍然非常小,可以忽略不计。
imo:如果您想要速度和易用性,请选择 node.js :)
以任何语言运行一个简单的应用程序总是更快。当它变得像facebook一样复杂时,您将面临许多问题。PHP 的缓慢将显示它的面子。同时,将现有代码转换为另一种语言不是一种选择,因为所有逻辑和代码都不容易翻译成其他语言的语法。这就是为什么 facebook 开发人员决定保留旧代码并让 PHP 更快的原因。这就是他们创建自己的 PHP 编译器(称为 HipHop)的原因。
从 Facebook 开发者的角度阅读这个故事,让你了解 HipHop 的历史。
这并不是一个真正的苹果对苹果的比较。在最公平的竞争环境中,您可能会遇到以下情况:
- Django 在 apache 后面运行
- Django 渲染一个 HTML 模板来打招呼(无缓存)
和
- HPHP 在 apache 后面运行
- HPHP 渲染一个 HTML 模板来向世界打招呼(同样,没有缓存)
没有数据库,几乎没有文件 I/O,也没有缓存。如果您使用负载生成器在不同的并发级别上访问页面 10,000 次,您可能会发现 HPHP 的性能将优于 Django 或 rails - 也就是说,它可以每秒渲染更多页面并更好地跟上您的流量。
问题是,你会有这么多并发用户吗?如果您愿意,他们可能会访问数据库或缓存页面吗?
HPHP 听起来很酷,但恕我直言,目前还没有理由跳船(除非您获得大量流量,在这种情况下检查它可能是有意义的)。