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

为什么PHP7比C++;有力地 我在PHP和C++中都有以下的实现。它只是将一个文件读入一个字符串,用空格分隔(我希望能够选择这个字符),然后在一个有2000万个空格分隔的随机数(称为“空格”)的文件上运行:,php,c++,performance,boost,Php,C++,Performance,Boost,在PHP中: <?php $a = explode(" ", file_get_contents("spaces")); echo "Count: ".count($a)."\n"; foreach ($a as $b) { echo $b."\n"; } 虽然你的问题非常具体,但我会给出一个更一般的答案,可能适合这里 高级语言往往是由非常聪明和有能力的程序员编写的。他们对所使用的工具非常熟悉,能够为常见的场景找到很好的解决方案,大多数情况下,这些解决方案的性能优于普通程序员编写的

在PHP中:

<?php

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

虽然你的问题非常具体,但我会给出一个更一般的答案,可能适合这里

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

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

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

一些解释语言使用一个名为的功能。这允许在运行时将更高级别的代码动态转换为机器代码

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


由于C语言和C++语言通常是编译为更广泛的CPU选择的,所以它们的代码可能不如JIT编译器创建的代码优化。

这是我们无法回答的,因为在这个过程中包含了很多变量——包括当前的环境。我们只是猜测。因为只有8%的代码?(JK,我不知道。)关于C++代码的一件事是,不要在 V中预先分配空间。如果您知道将有多少个元素,那么您应该
保留该空间,该空间将保存您当前方法所拥有的大量副本。对于这样一个小测试,3秒并不是一个有意义的差异。这可以很容易地用缓存、I/O活动或CPU活动来解释。循环中的
endl
可能也没有帮助——大量不必要的刷新。正确的回答应该是他正在使用endl。PHP不是冲到StdOutC++,它占用了50%的时间。PHP 8现在支持JIT!^ ^ ^
#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;
  }

}