Последние несколько лет на рынке, по моему сугубо личному мнению, golang вытесняет PHP с рынка, а многие компании считают, что проекты, которые сейчас написаны и работают на PHP должны быть переписаны на golang, чтобы было хорошо.
Такой подход только частично является правдой. На самом деле каждый язык программирования предназначен на решение определенного вида задач, а вопросы производительности в основном зависят очень сильно от разработчика, а не от языка программирования.
Видя это несправедливое отношение PHP, хочу опубликовать ряд статей, в котором рассказывать об особенностях разработки, проблемах, которые нужно учитывать, а также участников разработки, которых также часто забывают, например, devops-инженеров.
Перед тем, как начать писать статью, я проверил одну теорию, что golang быстрее и производительней PHP. Для этого я взял простую функцию — преобразование строки в json.
Программа на golang
func main() { // var data []byte // var err error data, err := os.ReadFile("test.json") if err != nil { log.Fatalln("Error reading file ", err) return } start := makeTimestamp() wg := &sync.WaitGroup{} for i := 0; i < 1000000000; i++ { wg.Add(1) go func() { defer wg.Done() var test *Test err = json.Unmarshal(data, &test) if err != nil { fmt.Println("Error reading file ", err) return } }() } wg.Wait() end := makeTimestamp() fmt.Printf("%.3fms \n", (end-start)/1e9) }
Программа на PHP
<?php $start = microtime(true); \Swoole\Coroutine\run(function () { $cnt = 1_000_000_000; $wg = new \Swoole\Coroutine\WaitGroup(); $fp = fopen(__DIR__ . '/test.json', 'rb'); if ($fp === false) { echo 'Error' . PHP_EOL; return; } defer(function() use($fp) { fclose($fp); }); $result = ''; while ($line = fread($fp, 1024)) { $result .= $line; } for ($i = 0; $i < $cnt; $i++) { $wg->add(); \Swoole\Coroutine::create(function () use ($wg, $i, $result) { $decoded = json_decode($result); unset($decoded); $wg->done(); }); } $wg->wait(); }); $end = microtime(true); file_put_contents('php://stdout', sprintf("%.3fms \n", ($end - $start)));
В результате выполнения этих команд получил:
Golang скомпилированный под локальную машину выполнял команду — 452.430ms
PHP в docker-образе выполнял команду — 390.859ms
Согласен, что этот пример не доказывает, что PHP быстрее чем Golang, но при этом, он развеивает миф, что golang однозначно лучше PHP.
Так же провел замеры при работе http сервера и PHP показал себя с хорошей стороны, в docker-образе, с подключением к базе данных, вставкой строки в базу и последующим селектом данных и базы и передачей json ответа http сервер на php выдержал 10.000 rps, со средним временем ответа 40мс, максимальным 500мс и минимальным 200 микросекунд, но об этом более детально напишу в следующих статьях.
Какая конечная цель будущего цикла статей:
-
Показать, что PHP хороший язык программирования, на котором можно делать web-проекты
-
Поделиться практиками разработки приложений, на что стоит обратить внимание и какие инструменты выбирать
-
Создать тестовое приложение, на котором можно будет посмотреть на один из вариантов организации работы в команде, чтобы каждому участнику команды (а для меня это: backend-разработчик, frontend-разработчик, devops-инженер, qa-инженер, бизнес/системный-аналитик и product-owner/manager, архитектор)
-
Показать пример unit-экономики, разделения продуктовых фич, расчета стоимости разработки и содержания проекта на разных языках программирования. (Опираться буду на PHP и Golang)
Следующая статья — какие варианты PHP-сервера существуют, что нужно о них знать разработчику.
Стати планирую публиковать по воскресеньям. От Вас, уважаемые читатели хабра, было бы здорово получить обратную связь, интересно ли вам это направление, в комментариях.
ссылка на оригинал статьи https://habr.com/ru/articles/830354/
Добавить комментарий