У меня есть следующая реализация как в 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 ++?
Хотя ваш вопрос очень конкретный, я дам ответ, который будет более общим и, возможно, подходящим здесь.
Языки высокого уровня, как правило, пишутся очень умными и способными программистами. Они хорошо знакомы с инструментами, которые они используют, и способны находить отличные решения для общих сценариев, решения, которые в большинстве случаев превосходят некоторый код, написанный обычным программистом. Таким образом, код в PHP, соответствующий общему сценарию, может превзойти плохую реализацию даже в сборке.
Возможное влияние JIT (сборка точно в срок)
Я прямо скажу, что это НЕ так, потому что PHP7 не поддерживает JIT-компиляцию, но это очень интересный случай, который может иметь отношение к любому программисту, который считает, что интерпретируемые языки всегда медленнее.
Некоторые интерпретируемые языки используют функцию под названием JIT (сборник Just-In-Time). Это позволяет динамически переводить код более высокого уровня в машинный код во время выполнения.
Поскольку этот процесс выполняется во время выполнения, компилятор знает точный процессор, что позволяет ему выбирать наиболее подходящий машинный код для миссии.
Поскольку языки, такие как C и C ++, часто компилируются для более широкого выбора процессоров, их код может быть не так оптимизирован, как код, созданный компилятором JIT.
Других решений пока нет …