![]() |
Производительность fast-cgi
Решил ради интереса создать маленький скрипт на с++ (cpp) ддя fast-cgi сервера для грубого сравнения производительности тайпо и (возможно) будущего движка, чей фронтенд генерируется сишным скриптом.
Специально использовал для теста старую машинку: Duron950, 700МБ оперативки и IDE диск на 15 гигабайт (2мб кэша) Допустил в скрипте следующие условности (относительно затрат на генерацию ОДНОЙ страницы): - количество запросов к БД - 100 (на КАЖДЫЙ запрос получаем 200 строк из мускульной таблицы, в которой 25000 записей) - 4500 конкатенаций юникодовых строк (русские символы, каждая строка - 15 символов) примерный код: Код:
for (int i=0;i<100;i++) { вот результаты: Код:
D:\Myprojects\CMSCpp\code\test2>D:\ApacheNew\apache\bin\ab -k -n 1000 http://l Итого получили: Requests per second: 16.89 [#/sec] (mean) Если учесть, что тайпо генерировала в установленном пакете квикстарт порядка 3 страниц в секунду (не знаю, есть ли там акселлератор), то 16 ответов в секунду от сишного скрипта не кажется плохим результатом ПС. Сравнивал конкатенацию строк с пхп на 100 000 циклах - в с++ реализация в 10 раз быстрее. |
И о чем нам это говорит? Это вы для чего написали? И где оно.. упомянутое сравнение с TYPO3?
И сравнение чего с чем??? FastCGI с TYPO3?? |
Цитата:
просто интересно аппроксимировать производительность скрипта, откомпилированного в машинные коды и пхп-скрипта с, примерно, той же нагрузкой на проц и базу |
[code]
/* * A simple FastCGI application example in C++. * * $Id: echo-cpp.cpp,v 1.10 2002/02/25 00:46:17 robs Exp $ * * Copyright (c) 2001 Rob Saccoccio and Chelsea Networks * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * 3. The name of the author may not be used to endorse or promote products * derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #pragma warning( disable : 4251) #define UNICODE #include <stdlib.h> #ifdef _WIN32 #include <process.h> #else #include <unistd.h> extern char ** environ; #endif #include "fcgio.h" #include "fcgi_config.h" // HAVE_IOSTREAM_WITHASSIGN_STREAMBUF #include "c2plib_string.h" #include "mysql++.h" using namespace std; // Maximum number of bytes allowed to be read from stdin static const unsigned long STDIN_MAX = 1000000; int main (void) { int count = 0; streambuf * cin_streambuf = cin.rdbuf(); streambuf * cout_streambuf = cout.rdbuf(); streambuf * cerr_streambuf = cerr.rdbuf(); // Connect to the sample database. mysqlpp::Connection con(false); if (!con.connect("test", "localhost", "root", "11111", 3306)) { return 1; } tchar_stuff::string_t s(_T("фываыафваафвафываыафваафва")); tchar_stuff::string_t s1(_T("фываыафваафвафываыафваафва")); s.reserve(10000); s1.reserve(10000); mysqlpp::Query query = con.query(); mysqlpp::ResUse res; mysqlpp::Row row; FCGX_Request request; FCGX_Init(); FCGX_InitRequest(&request, 0, 0); while (FCGX_Accept_r(&request) == 0) { // Note that the default bufsize (0) will cause the use of iostream // methods that require positioning (such as peek(), seek(), // unget() and putback()) to fail (in favour of more efficient IO). fcgi_streambuf cin_fcgi_streambuf(request.in); fcgi_streambuf cout_fcgi_streambuf(request.out); fcgi_streambuf cerr_fcgi_streambuf(request.err); #if HAVE_IOSTREAM_WITHASSIGN_STREAMBUF cin = &cin_fcgi_streambuf; cout = &cout_fcgi_streambuf; cerr = &cerr_fcgi_streambuf; #else cin.rdbuf(&cin_fcgi_streambuf); cout.rdbuf(&cout_fcgi_streambuf); cerr.rdbuf(&cerr_fcgi_streambuf); #endif // Although FastCGI supports writing before reading, // many http clients (browsers) don't support it (so // the connection deadlocks until a timeout expires!). //tchar_stuff::string_t s(_T("фываыафваафва")); cout << _T("Content-type: text/html; charset=UTF-8\r\n\r\n"); for (int i=0;i<100;i++) { query << "select * from testtable where uid>5000 and uid<5210"; res = query.use(); // Retreive result rows one by one, and display them. if (res) { // Display header cout.setf(ios::left); cout << setw(21) << "uid" << setw(10) << "desc" << endl << endl; // Get each row in result set, and print its contents while (row = res.fetch_row()) { cout << s.c_str() << "<br/>"; cout << row["uid"] << ' ' << row["desc"] << ' ' << "<br/>" << endl; } } } s = _T("фываыафваафва"); s1= _T("фываыафваафва"); for (int i=0; i<4500; i++) { s += s1; } //cout << s.c_str(); } #if HAVE_IOSTREAM_WITHASSIGN_STREAMBUF cin = cin_streambuf; cout = cout_streambuf; cerr = cerr_streambuf; #else cin.rdbuf(cin_streambuf); cout.rdbuf(cout_streambuf); cerr.rdbuf(cerr_streambuf); #endif return 0; } [code] |
Цитата:
Да и сравниваете вы совсем другое....вообще непонятно что с непонятно чем.... и Вам не в этот форум... |
Цитата:
си ничем не быстрее си++, это очевидно.. на выходе компилятора получаем тот же бинарный код с функциями во-вторых, мне было интересно поисследовать тему бинарных скриптов под нагрузкой, сравнимой (или превосходящей) тайповскую, и выложить результаты - может кто-то решиться не ставить тайпу и искать другое решение, например, теже бинарные скрипты в-третьих, форум называется "Общие вопросы", поэтому, что за привычка флудить порожними разговорами? |
во-первых, использование объектов влечет за собой дополнитиельные расходы (например с динамическим выделением памяти) и статическое выделение памяти (в случае Си) будет работать быстрее (не верите, проверьте). И что код на выходе получается совершенно разный... и что компиляторы С и С++ вообще говоря соверщенно разные... но это же вы можете такие мелочи спокойно опустить, да?
во-вторых, мы конечно же можем опустить что TYPO3 (еще раз напомню, CMS!!!) исходники которой составляют несколько мегабайт, сравниваются со програмулькой в пару строчек (я говорю о сложности системы), и конечно же правомерно принебречь тем фактом, что нормально настроенная система TYPO3 выдает порядка 50 запросов в секунду. Можно так же пренебречь, что сравнивается выполнение 100 запросов к базе с выполнением от силы 10... если кэша в TYPO3 нет. в-третьих, само собой разумеется, считается, что в форум про TYPO3 нужно писать про "нечто".... и выдавать свой флуд за научные изыскания. Я так и не понял... Зачем???? Цель то какая? Доказать, что PHP (C TYPO3 сравнивать нельзя!!!!) медленне чем C++? А Вы не знали, что язык написанный на C/C++ будет медленнее того, на чем он пишется (просто исходя из логики)? По секрету скажу, PHP медленне всех существующих альтернативных скриптовых языков (Perl, Ruby, Python)... не говоря уже о компилируемых... Взяли бы тесты, посмотрели... только нормальные, которые сравнимые вещи измеряют, а не столб с забором... Только я не понял... и что? |
Цитата:
мне были интересны цифры, насколько производительнее бинарный скрипт... а насчет си и с++ - компиляторы разные, в с++ сложнее, но зато на выходе примерно одинаковый по эффективности код в си не меньше выделяется динамической памяти по сравнению с с++ |
Часовой пояс GMT +4, время: 22:33. |
Работает на vBulletin® версия 3.8.1.
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Перевод: zCarot