Всем привет, решил поделиться с вами результатами синтетического теста производительности свежих версий PHP и Node.js.
Конфигурация сервера:
Простой VDS — 1 ядро процессора 2ГГц, 1Гб оперативы, 10Гб SSD.
ОС: Debian 8.6.
Так же произведены базовые настройки ядра, чтобы сервер в принципе мог обрабатывать большое кол-во соединений.
Испытуемые:
— PHP 7.1.1 FPM
— Node.js 7.4.0
Первый этап:
Тут операции, которые в основном использует backend. А именно: склеивание строк, сетевой ввод-вывод, арифметика и работа с массивами.
Код для Node.js:
Код для PHP:
Результаты:

Как видно, PHP выигрывает по всем пунктам, кроме операции сложения.
Второй этап:
Нагрузочное тестирование «Hello world». Nginx 11.7 + PHP 7.1.1 FPM vs Node.js. 1000 запросов в 1000 потоков. #ab -n 1000 -c 1000…
Код PHP:
Код Node.js:
Результаты
Прогнал по 10 тестов для PHP и для Node.js и выбрал лучшие результаты у обоих.
Node.js:

PHP:

Как видим и тут PHP выигрывает на 23% или на 628 запросов в секунду. Много это или мало судить вам.
Делитесь в комментах своими мыслями по этому поводу.
Конфигурация сервера:
Простой VDS — 1 ядро процессора 2ГГц, 1Гб оперативы, 10Гб SSD.
ОС: Debian 8.6.
Так же произведены базовые настройки ядра, чтобы сервер в принципе мог обрабатывать большое кол-во соединений.
Испытуемые:
— PHP 7.1.1 FPM
— Node.js 7.4.0
Первый этап:
Тут операции, которые в основном использует backend. А именно: склеивание строк, сетевой ввод-вывод, арифметика и работа с массивами.
Код для Node.js:
var fs = require('fs'); var mysql = require('mysql2'); console.time('Node.js ' + process.version + ': склеивание строк 1000000 раз'); var str = ''; for (var i = 0; i < 1000000; i++) { str += 's'; } console.timeEnd('Node.js ' + process.version + ': склеивание строк 1000000 раз'); console.time('Node.js ' + process.version + ': сложение чисел 1000000 раз'); var count = 0; for (var i = 0; i < 1000000; i++) { count++; } console.timeEnd('Node.js ' + process.version + ': сложение чисел 1000000 раз'); console.time('Node.js ' + process.version + ': наполнение простого массива 1000000 раз'); var array = []; for (var i = 0; i < 1000000; i++) { array.push('s'); } console.timeEnd('Node.js ' + process.version + ': наполнение простого массива 1000000 раз'); console.time('Node.js ' + process.version + ': наполнение ассоциативного массива 1000000 раз'); var array = {}; for (var i = 0; i < 1000000; i++) { array['s' + i] = 's'; } console.timeEnd('Node.js ' + process.version + ': наполнение ассоциативного массива 1000000 раз'); console.time('Node.js ' + process.version + ': чтение файла 100 раз'); var content; for (var i = 0; i < 100; i++) { content = fs.readFileSync('./someFile.txt'); } console.timeEnd('Node.js ' + process.version + ': чтение файла 100 раз'); console.time('Node.js ' + process.version + ': mysql query (SELECT NOW()) 100 раз'); // create the connection to database var connection = mysql.createConnection({host:'localhost', user: 'root', database: 'test', password: 'password'}); function promiseQuery(query) { return new Promise((resolve, reject) => { connection.query(query, function (err, results, fields) { resolve({err, results, fields}); }); }); } for (var i = 0; i < 100; i++) { var a = promiseQuery('SELECT NOW()'); a.then(({err, results, fields}) => { //console.log(results); }); } console.timeEnd('Node.js ' + process.version + ': mysql query (SELECT NOW()) 100 раз'); connection.end();
Код для PHP:
<?php $phpVersion = "v" . explode('-', PHP_VERSION)[0]; $start = microtime(1); $str = ''; for ($i = 0; $i < 1000000; $i++) { $str .= 's'; } echo "PHP $phpVersion: склеивание строк 1000000 раз: " . round((microtime(1) - $start) * 1000, 3) . "ms \n"; $start = microtime(1); $count = 0; for ($i = 0; $i < 1000000; $i++) { $count++; } echo "PHP $phpVersion: сложение чисел 1000000 раз: " . round((microtime(1) - $start) * 1000, 3) . "ms \n"; $start = microtime(1); $array = array(); for ($i = 0; $i < 1000000; $i++) { $array[] = 's'; } echo "PHP $phpVersion: наполнение простого массива 1000000 раз: " . round((microtime(1) - $start) * 1000, 3) . "ms \n"; $start = microtime(1); $array = array(); for ($i = 0; $i < 1000000; $i++) { $array["s" . $i] = 's'; } echo "PHP $phpVersion: наполнение ассоциативного массива 1000000 раз: " . round((microtime(1) - $start) * 1000, 3) . "ms \n"; $start = microtime(1); for ($i = 0; $i < 100; $i++) { $fp = fopen("./someFile.txt", "r"); $content = fread($fp, filesize("./someFile.txt")); fclose($fp); } echo "PHP $phpVersion: чтение файла 100 раз: " . round((microtime(1) - $start) * 1000, 3) . "ms \n"; $start = microtime(1); $mysql = new mysqli('localhost', 'root', 'password', 'test'); for ($i = 0; $i < 100; $i++) { $res = $mysql->query("SELECT NOW() as `now`"); $now = $res->fetch_assoc()['now']; } echo "PHP $phpVersion: mysql query (SELECT NOW()) 100 раз: " . round((microtime(1) - $start) * 1000, 3) . "ms \n";
Результаты:

Как видно, PHP выигрывает по всем пунктам, кроме операции сложения.
Второй этап:
Нагрузочное тестирование «Hello world». Nginx 11.7 + PHP 7.1.1 FPM vs Node.js. 1000 запросов в 1000 потоков. #ab -n 1000 -c 1000…
Код PHP:
<?php echo "Hello world"; ?>
Код Node.js:
const http = require('http'); const hostname = '127.0.0.1'; const port = 3000; const server = http.createServer((req, res) => { res.statusCode = 200; res.setHeader('Content-Type', 'text/plain'); res.end('Hello World'); }); server.listen(port, hostname, () => { console.log(`Server running at http://${hostname}:${port}/`); });
Результаты
Прогнал по 10 тестов для PHP и для Node.js и выбрал лучшие результаты у обоих.
Node.js:

PHP:

Как видим и тут PHP выигрывает на 23% или на 628 запросов в секунду. Много это или мало судить вам.
Делитесь в комментах своими мыслями по этому поводу.