为什么带有Boost的PHP7比C ++更快

Nie*_*els -2 php c++ performance boost

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

在PHP中:

<?php

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

在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;
  }

}
Run Code Online (Sandbox Code Playgroud)

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

Dan*_*man 5

尽管您的问题非常具体,但我会给出一个较为笼统的答案,可能在这里很合适。

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

JIT的可能效果(及时编译)

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

某些解释语言使用称为JIT(即时编译)的功能。这允许在运行时将高级代码动态转换为机器代码。

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

由于诸如C和C ++之类的语言通常是为更广泛的CPU选择而编译的,因此它们的代码可能不如JIT编译器创建的代码那样优化。

  • 正确的答案是他正在使用endl。PHP没有刷新到标准输出C ++,这花费了50%的时间。 (2认同)