Как стать автором
Поиск
Написать публикацию
Обновить

Golang убивает PHP

Уровень сложностиСредний
Время на прочтение3 мин
Количество просмотров40K

Последние несколько лет на рынке, по моему сугубо личному мнению, 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‑сервера существуют, что нужно о них знать разработчику.

Статьи планирую публиковать по воскресеньям. От Вас, уважаемые читатели Хабра, было бы здорово получить обратную связь, интересно ли вам это направление, в комментариях.

Только зарегистрированные пользователи могут участвовать в опросе. Войдите, пожалуйста.
Интересно продолжение
63.81%Да529
36.19%Нет300
Проголосовали 829 пользователей. Воздержались 82 пользователя.
Теги:
Хабы:
Всего голосов 79: ↑53 и ↓26+44
Комментарии634

Публикации

Ближайшие события