#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 было несколько миллисекунд на подготовку наборов результатов).