【问题标题】:Why is PHP7 faster than C++ with Boost [closed]为什么 PHP7 比使用 Boost 的 C++ 更快 [关闭]
【发布时间】:2017-09-29 14:50:17
【问题描述】:

我在 PHP 和带有 Boost 的 C++ 中都有以下实现。它只是将一个文件读入一个字符串,用空格分隔(我希望能够选择这个字符),然后在一个包含 2000 万个空格分隔的随机数(称为“空格”)的文件上运行:

在 PHP 中:

<?php

$a = explode(" ", file_get_contents("spaces"));
echo "Count: ".count($a)."\n";
foreach ($a as $b) {
  echo $b."\n";
}

在 C++ 中:

#include <boost/algorithm/string.hpp>
#include <string>
#include <vector>
#include <iostream>
#include <fstream>
#include <sstream>
#include <stdio.h>

using namespace boost;
using namespace std;

int main(int argc, char* argv[])
{
//  ifstream ifs("spaces");

//  string s ((istreambuf_iterator<char>(ifs)), (istreambuf_iterator<char>()));
  char * buffer = 0;
  long length;
  string filename = "spaces";
  FILE * f = fopen (filename.c_str(), "rb");

  if (f)
  {
    fseek (f, 0, SEEK_END);
    length = ftell (f);
    fseek (f, 0, SEEK_SET);
    buffer = (char*) malloc (length);
    if (buffer)
    {
      size_t t = fread (buffer, 1, length, f);
    }
    fclose (f);
  }
  string s(buffer, 0, length);
  vector <string> v;

  split(v, s, is_any_of(" "));

  cout << "Count: " << v.size() << endl;

  for (int i = 0; i < v.size(); i++) {
    cout << v[i] << endl;
  }

}

我用 g++ split.cpp -O2 -o split 编译它并在我的系统上持续运行它需要 4.5 秒,PHP7 需要 4.2 秒。 PHP 怎么能比 C++ 快 8%?

【问题讨论】:

  • 这是我们无法回答的问题,因为过程中涉及许多变量——包括您当前的环境。我们只是猜测。
  • 因为只有 8% 的代码? (jk,我不知道。)
  • 关于您的 C++ 代码的一件事是您没有在 v 中预先分配空间。如果您知道会有多少元素,那么您应该reserve 那个空间,这将节省您当前方法所拥有的很多副本。
  • .3 秒对于这么小的测试来说并没有什么意义。这很容易通过缓存、I/O 活动或 CPU 活动来解释。
  • 循环中的endl 可能也无济于事——大量不必要的刷新。

标签: php c++ performance boost


【解决方案1】:

虽然你的问题很具体,但我会给出一个更笼统的答案,可能适合这里。

高级语言往往由非常聪明和有能力的程序员编写。他们非常熟悉他们使用的工具,并且能够为常见的案例场景找到很好的解决方案,在大多数情况下,解决方案的性能优于普通程序员编写的一些代码。因此,即使在汇编中,匹配常见场景的 PHP 代码也可以胜过糟糕的实现。

JIT(即时编译)的可能影响

我将明确声明这里不是这种情况,因为 PHP7 不支持 JIT 编译,但这是一个非常有趣的情况,可能与任何认为解释语言总是较慢的程序员有关。

某些解释型语言使用称为JIT (Just-In-Time compilation) 的功能。这允许在运行时将高级代码动态转换为机器代码。

由于这个过程是在运行时完成的,编译器知道确切的 CPU,从而使它能够为任务选择最合适的机器代码。

由于 C 和 C++ 等语言通常针对更广泛的 CPU 选择进行编译,因此它们的代码可能不如 JIT 编译器创建的代码那么优化。

【讨论】:

  • 正确的回答是他使用的是endl。 PHP 没有刷新到标准输出 C++ 占用了 50% 的时间。
  • PHP 8 现在支持 JIT! ^_^
猜你喜欢
  • 2012-11-30
  • 2018-07-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-05
  • 2013-10-03
  • 2019-04-30
  • 1970-01-01
相关资源
最近更新 更多