Почему PHP7 быстрее, чем C ++ с Boost

У меня есть следующая реализация как в PHP, так и в C ++ с Boost. Он просто читает файл в строку, разделяет его пробелами (я хочу иметь возможность выбрать этот символ) и запускает файл с 20 миллионами случайных чисел, разделенных пробелами (называемых «пробелами»):

В 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 может быть на 8% быстрее, чем C ++?

-3

Решение

Хотя ваш вопрос очень конкретный, я дам ответ, который будет более общим и, возможно, подходящим здесь.

Языки высокого уровня, как правило, пишутся очень умными и способными программистами. Они хорошо знакомы с инструментами, которые они используют, и способны находить отличные решения для общих сценариев, решения, которые в большинстве случаев превосходят некоторый код, написанный обычным программистом. Таким образом, код в PHP, соответствующий общему сценарию, может превзойти плохую реализацию даже в сборке.

Возможное влияние JIT (сборка точно в срок)

Я прямо скажу, что это НЕ так, потому что PHP7 не поддерживает JIT-компиляцию, но это очень интересный случай, который может иметь отношение к любому программисту, который считает, что интерпретируемые языки всегда медленнее.

Некоторые интерпретируемые языки используют функцию под названием JIT (сборник Just-In-Time). Это позволяет динамически переводить код более высокого уровня в машинный код во время выполнения.

Поскольку этот процесс выполняется во время выполнения, компилятор знает точный процессор, что позволяет ему выбирать наиболее подходящий машинный код для миссии.

Поскольку языки, такие как C и C ++, часто компилируются для более широкого выбора процессоров, их код может быть не так оптимизирован, как код, созданный компилятором JIT.

4

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]