Golang убивает PHP

в 18:57, , рубрики: php, разработка

Последние несколько лет на рынке, по моему сугубо личному мнению, 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);

SwooleCoroutinerun(function () {
    $cnt = 1_000_000_000;

    $wg = new SwooleCoroutineWaitGroup();

    $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();
        SwooleCoroutine::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://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js