С точки зрения производительности … exec (c ) или обычный PHP?

#php #c #performance

#php #c #Производительность

Вопрос:

Интересно, что было бы быстрее для mysql open, select и общего вывода данных:

А) Скомпилированный код на C вызывается через exec() (или что-то эквивалентное)

или

Б) Прямой PHP-код.

Учитывая, что весь код одинаково написан как на C , так и на PHP.

Провел тест: это C

 Document Length:        100000 bytes
Concurrency Level:      2
Time taken for tests:   0.139 seconds
Complete requests:      10
Failed requests:        0
Write errors:           0
Total transferred:      1001550 bytes
HTML transferred:       1000000 bytes
Requests per second:    71.76 [#/sec] (mean)
Time per request:       27.872 [ms] (mean)
Time per request:       13.936 [ms] (mean, across all concurrent requests)
Transfer rate:          7018.29 [Kbytes/sec] received
  

Это PHP:

 Concurrency Level:      2
Time taken for tests:   4.115 seconds
Complete requests:      10
Failed requests:        0
Write errors:           0
Total transferred:      1001550 bytes
HTML transferred:       1000000 bytes
Requests per second:    2.43 [#/sec] (mean)
Time per request:       822.924 [ms] (mean)
Time per request:       411.462 [ms] (mean, across all concurrent requests)
Transfer rate:          237.71 [Kbytes/sec] received
  

Вот программы (я не включал код MySQL — просто хотел посмотреть, было ли создание стека быстрее с помощью базового кода).

C

 #include <iostream>
#include <sstream>
#include <string>

using namespace std;

int main()
{
    stringstream x;
    //string x;
    for (int i = 0; i < 100000;   i)
    {
        x << "X";
    }

    cout << x.str();
    return 0;
}
  

Вот PHP:

 for ($i=0; $i<100000;   $i)
{
    $x = $x . "X";
}

echo $x;
  

Не знаю, справедлив ли его тест с использованием stringsteam … мысли? Я думаю, что C будет быстрее, независимо от нового экземпляра стека и подключений к mysql.

Редактировать:

Протестировано с этим:

 #include <iostream>
#include <sstream>
#include <string>

using namespace std;

int main()
{
    //stringstream x;
    string x;
    for (int i = 0; i < 100000;   i)
    {
        x = x   "X";
    }

    cout << x;
    return 0;
}
  

и, тем не менее, быстрее!

 Concurrency Level:      2
Time taken for tests:   0.115 seconds
Complete requests:      10
Failed requests:        0
Write errors:           0
Total transferred:      1740 bytes
HTML transferred:       0 bytes
Requests per second:    86.98 [#/sec] (mean)
Time per request:       22.994 [ms] (mean)
Time per request:       11.497 [ms] (mean, across all concurrent requests)
Transfer rate:          14.78 [Kbytes/sec] received
  

Редактировать:

Вот php-программа, которая вызывает файл C

 <?php

echo exec("./test");
  

Комментарии:

1. Ну, почему бы вам не попробовать оба варианта и время / профиль каждого?

2. Сохранение дескриптора подключения к БД, привязанного к вашему PHP-сеансу, интуитивно понятно, я бы сказал, что PHP предоставит вам более немедленный доступ (используя для этого уровень подключения, такой как PEAR:: MDB2).

3. Поработав с программой, которая делала нечто подобное на perl, я могу сказать вам, что переключение ее на полностью нативную реализацию (на python) сократило время выполнения с 10 минут до < 1 минуты. Для сравнения, мы выполняли ~ 300 вызовов командной строки.

4. Выполнено… за исключением MySQL. Я думаю, что с уверенностью можно предположить, что выполнение C через exec () быстрее, чем прямой php.

5. Используйте обычный std::string with = , потому что x.str() создает новую строку из буфера, искажая реальное время, которое требуется. 😛 Помимо этого, разве SQL-часть не самая важная?! Кроме того, вы просто выполнили код C как есть или с exec ?

Ответ №1:

Итак, давайте посмотрим. Давайте запустим оболочку, передадим ей несколько аргументов, которая запустит другое приложение, которое загрузит серию библиотек .so, а затем подключится к mysql, что-то сделает, затем должен быть возвращен потенциально огромный объем выходных данных через printf () или эквивалент, который затем должен быть отправлен обратно в PHP, проанализирован как обычный текст, разорван на части, а затем превращен в какую-то согласованную структуру.

И это было бы быстрее, чем выполнение запроса в MySQL и получение данных непосредственно в структуру PHP?

Может быть, вам стоит это протестировать…

Комментарии:

1. Я надеялся, что кто-то уже сделал это, я подожду пару дней на всякий случай, а затем начну… Я сообщу о своей работе здесь.

2. Не существует такой вещи, как получение данных непосредственно в структуру PHP. За кулисами все эти вещи все еще продолжаются.

3. @Pacerier: Если вы думаете, что PHP взаимодействует с mysql именно так, я предлагаю вам изучить исходный код. Это может быть loading .so (хотя обычно mysql компилируется в), но он не использует printf и синтаксический анализ текста для передачи данных туда и обратно.

Ответ №2:

Если вы не обрабатываете сотни операций чтения / записи в секунду, разница, скорее всего, будет близка к незначительной, если вообще существует.

Ответ №3:

Если вы добавите в свой дополненный код C расширение as PHP, то да, это имело бы смысл. Но если вы не выполняете значительные вычисления с результирующими данными с помощью C / C , это не быстрее, чем выполнение их в виде кода PHP scripting.

Вы, скорее всего, увидите увеличение производительности, если вместо этого оптимизируете / денормализуете свою схему базы данных или используете запрос асинхронно (выдаете mysql_query при запуске скрипта, делаете что-то еще и только mysql_fetch_assoc, когда у сервера mysqld было несколько миллисекунд на подготовку наборов результатов).