Модераторы: korob2001, ginnie
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Помогите советом ламеру, CGI или PHP программирование 
:(
    Опции темы
Icaros
  Дата 26.5.2006, 18:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 30
Регистрация: 26.5.2006

Репутация: нет
Всего: нет



Уважаемые пользователи Сети. Помогите советом ламеру. Есть такая задача: необходимо написать программу для решения уравнений теплопроводности методом Фурье. Если не вдаваться в подробности теории, скажу следующее: в принципе есть некое уравнение, которое просчитывается много раз. в результате должен быть образован массив с решением уравнений. Все дело в том, что программа должна довольно много считать. В конце нужно построить график по результатам. Если спросите зачем это все, то отвечу - просто надо. И надо реализовать именно для Web. 
Я написал программу на PHP. Но, к сожалению, она слишком долго выполняется (45 секунд). Мне сказали, чтобы я обратил внимание на CGI программирование, якобы программы, написанные для CGI гораздо быстрее выполняются. 
Подскажите пожалуйста, есть ли смысл писать программу для CGI и если есть, то на каком языке ?  smile  
PM MAIL   Вверх
Tirael
Дата 26.5.2006, 20:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 154
Регистрация: 31.1.2006
Где: Москва

Репутация: нет
Всего: 7



Хммм...почему меня берут сомнения, что дело воовсе не в языке программирования. на сколько ты думаешь CGI быстрее PHP ? Наверное прцентов на 5-20. Ощутимого уменьшения времени это не даст. 
Скорее всего дело в алгоритме, который медленно работает. 

Программу в СТУДИЮ  smile  
--------------------
 
PM MAIL   Вверх
Usya
Дата 26.5.2006, 22:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 154
Регистрация: 7.6.2005

Репутация: нет
Всего: нет



Icaros, если ты думаешь, что проблема в PHP, накатай программу на Си, Паскале... и сравни результаты. Это первый вариант.
Другой вариант - то, что тебе преложил Tirael. При этом тебе, конечно, проще, но далеко не каждый будет разбираться в твоем коде (это же не несколько строк). Дадут скорее всего поверхностные советы, которые, в принципе, могут существенно помочь, а могут и нет. Кстати, если воспользуешься этим вариантом, то тебе, скорее всего, на другую ветку, т.к. код на PHP у тебя уже есть.

Хотя как сказал Tirael:
Цитата
Скорее всего дело в алгоритме, который медленно работает. 
  
--------------------
Я не волшебник, я только учусь...
PM MAIL   Вверх
Icaros
Дата 30.5.2006, 09:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 30
Регистрация: 26.5.2006

Репутация: нет
Всего: нет



Код

<?php
//******************************************************** 
//    File: furie.php
//    Date: 11.05.2006
//  
//********************************************************
function mFurie($Tm='none', $t='none', $Lm='none', $N='none', $Km='none', $tcount='none', $a='none') {
    // Проверяем входящие данные
    $Tm !== 'none' ? $Tm = (double)$Tm : OnErr('Вы не ввели переменную Tm');
    $t !== 'none' ? $t = (double)$t : OnErr('Вы не ввели переменную t');
    $Lm !== 'none' ? $Lm = (double)$Lm : OnErr('Вы не ввели переменную Lm');
    $N !== 'none' ? $N = (integer)$N : OnErr('Вы не ввели переменную N');
    $Km !== 'none' ? $Km = (integer)$Km : OnErr('Вы не ввели переменную Km');
    $tcount !== 'none' ? $tcount = (integer)$tcount : OnErr('Вы не ввели переменную tcount');
    $a !== 'none' ? $a = (integer)$a : OnErr('Вы не ввели переменную a');
    
    // Вычисляем переменные
    $dx = $Lm / $N;
    $tone = $Tm / $tcount;
    
    // Создаем дополнительные переменные
    $u = array(array($N + 1), array($tcount));
    $x = 0;
    $k = 0;
    $Bk = 0;
    
    //******* Основной расчет *********
    // По времени 
    for($i=0; $i<=$Tm; $i+=$tone) {
        $t = $t + 1;
        // По длине
        for($j=1; $j<=($N+1); $j++) {
            if($j == 1 || $j == ($N + 1)) {
                $u[$j][$t] = 0;
            }
            else {
                $u[$j][$t] = 0;
                // По числу итераций - k
                for($z=1; $z<=$Km; $z++) {
                    $k = $z;
                    $Bk = findBk($Lm, $k);
                    $u[$j][$t] = $u[$j][$t] + $Bk*exp(-(($k * pi() / $Lm) ^ 2) * ($a ^ $a) * $i) * sin($k * pi() * $x / $Lm);
                }
                $k = 0;
            }
            $x += $dx;
        }
        $x = 0;
    }
    
    //HTML_showResults($x, $dx, $u, $N, $tcount);
    createFileWithData($x, $dx, $u, $N, $tcount);
}

function findBk($Lm, $k) {
    $Bk = (2 / $Lm) * intGauss($Lm, $k);
    return $Bk;
}

function defaultFunction($x, $Lm, $k) {
    $func = ($Lm - $x) * sin($k * pi() * $x / $Lm);
    return $func;
}

function intGauss($Lm, $k) {
    // Создаем локальные переменные
    $N = 16;
    $a = 0;
    $b = $Lm;
    
    $gauss = gauss8points($a, $b, $N, 8, $Lm, $k);
    return $gauss;
}

function gauss8points($a, $b, $N, $Nint, $Lm, $k) {
    // Создаем локальные переменные
    $x = range(0, 10);
    $c = range(0, 10);
    $s = 0.0;
    $r = 0.0;
    $q = 0.0;
    $h = 0.0;
    $s1 = 0.0;
    $a1 = 0;
    $b1 = 0;
    
    $h = ($b - $a) / $N;
    gaussCoeffs($x, $c, $Nint);
    
    for($i=0; $i<=($N-1); $i++) {
        $a1 = $a + $i * $h;
        $b1 = $a1 + $h;
        $r = ($a1 + $b1) / 2;
        $q = ($b1 - $a1) / 2;
        $s1 = 0;
        
        for($j=0; $j<=($Nint-1); $j++) {
            $s1 = $s1 + $c[$j] * defaultFunction(($r + $q * $x[$j]), $Lm, $k);
        }
        
        $s = $s + $s1 * $q;
    }
    
    $g8p = $s;
    return  $g8p;
}

function gaussCoeffs(&$x, &$c, $Nint) {
    //global $x, $c;
    
    switch ($Nint) {
        case 1:
            $x[0] = 0;
            $c[0] = 2;  
            break;
        case 2:
           $x[0] = 0.577350269189626;
           $c[0] = 1;
           break;
        case 3:
         $x[0] = 0.774596669241;
         $x[1] = 0;
           $c[0] = 0.555555555555556;
           $c[1] = 0.888888888888889;
           break;
        case 4:
           $x[0] = 0.861136311594053;
           $x[1] = 0.339981043584856;
           $c[0] = 0.347854845137454;
           $c[1] = 0.652145154862546;
           break;
        case 5:
           $x[0] = 0.906179845938664;
           $x[1] = 0.538469310105683;
            $x[2] = 0;
           $c[0] = 0.236926885056189;
           $c[1] = 0.478628670499366;
           $c[2] = 0.568888888888889;
           break;
        case 6:
           $x[0] = 0.932469514203152;
           $x[1] = 0.661209386466265;
           $x[2] = 0.238619186083197;
           $c[0] = 0.17132449237917;
           $c[1] = 0.360761573048139;
           $c[2] = 0.467913934572691;
           break;
        case 7:
           $x[0] = 0.949107912342759;
           $x[1] = 0.741531185599394;
           $x[2] = 0.405845151377397;
           $x[3] = 0;
           $c[0] = 0.12948496616887;
           $c[1] = 0.279705391489277;
           $c[2] = 0.381830050505119;
           $c[3] = 0.417959183673469;
           break;
        case 8:
           $x[0] = 0.960289856497536;
           $x[1] = 0.796666477413627;
           $x[2] = 0.525532409916329;
           $x[3] = 0.18343464249565;
           $c[0] = 0.101228536290376;
           $c[1] = 0.222381034453374;
           $c[2] = 0.313706645877887;
           $c[3] = 0.362683783378362;
           break;
        case 9:
           $x[0] = 0.968160239507626;
           $x[1] = 0.836031107326636;
           $x[2] = 0.61337143270059;  
           $x[3] = 0.324253423403809;
           $x[4] = 0;
           $c[0] = 0.081274388361574;
           $c[1] = 0.180648160694857;
           $c[2] = 0.260610696402935;
           $c[3] = 0.312347077040003;
           $c[4] = 0.33023935500126;
           break;
        case 10:
           $x[0] = 0.973906528517172;
           $x[1] = 0.865063366688985;
           $x[2] = 0.679409568299024;
           $x[3] = 0.433395394129247;
           $x[4] = 0.148874338981631;
           $c[0] = 0.066671344308688;
           $c[1] = 0.149451349150581;
           $c[2] = 0.219086362515982;
           $c[3] = 0.269266719309996;
           $c[4] = 0.295524224714753;
           break;
          default:
           OnErr('Неверно выбран параметр количество точек интегрирования. Задайте его в диапазоне [1, 10].');
    }
    
    $NintSr = (integer)(($Nint - 1) / 2);
    for($i=0; $i<=$NintSr; $i++) {
        $x[$NintSr + 1 + $i] = -$x[$i];
        $c[$NintSr + 1 + $i] = $c[$i];
    }
}

/*function HTML_showResults($x, $dx, $u, $N, $tcount) {
    ?>
        <table border="1px" bgcolor="Aqua">
            <tr>
                <th colspan="<?=$tcount;?>">Таблица с результатами</th>
            </tr>
            <tr>    
    <?php
    for($i=1; $i<=$tcount; $i++) {
        $x = 0;
        ?>
        <td>
        <table>
            <tr>
                <th>X</th>
                <th>U(j, i)</th>
            </tr>
            <tr>
                <td colspan="2">время t = <?=$i;?></td>
            </tr>    
        <?php
        for($j=1; $j<=($N+1); $j++) {
        ?>
            <tr>
                <td><?=$x;?></td>
                <td><?=$u[$j][$i];?></td>
            </tr>
        <?php
        $x += $dx;
        }
        ?>
            </table>
            </td>
        <?php
    }
    ?>
            </tr>
        </table>
    <?php
}*/

function createFileWithData($x, $dx, $u, $N, $tcount) {
    $fp = fopen('./data/data.csv', 'w');
    $x = 0;
    
    for($i=1; $i<=($N+1); $i++) {
        $xstr = strtr((string)$x, '.', ',');
        $str = $xstr.";".strtr((string)$u[$i][1], '.', ',').";".$xstr.";".strtr((string)$u[$i][2], '.', ',').";".$xstr.";".strtr((string)$u[$i][3], '.', ',').";".$xstr.";".strtr((string)$u[$i][4], '.', ',').";".$xstr.";".strtr((string)$u[$i][5], '.', ',')." \n";
        echo '<em><strong>'.$i.':</strong></em> '.$str.'<br />';
        fwrite($fp, $str);
        $x+=$dx;
    }
    
    fclose($fp);
    echo '<script>alert("Выполнение завершено.");</script>';
}

function OnErr($str) {
    exit($str);
}

echo '<strong>Шаг №1:</strong> <em>начало расчета. ('.date('d-m-Y').')</em><br /><hr />';
mFurie(1, 0, 1, 100, 100, 5, 1.0);
echo '<hr />';
if(file_exists('./data/data.csv')) {
    echo '<strong>Шаг №2:</strong> <em>расчет завершен. Файл с результатами <a href="./data/data.csv">здесь</a></em><br />';
} else {
    echo '<strong style="color:red">Внимание!</strong> <strong>файл с результатами невозможно найти</strong>';    
}
?>
 

На VB эта программа работает довольно быстро. Там, где три вложенных цикла, программа должна провести около 50000 операций.  

Это сообщение отредактировал(а) Icaros - 30.5.2006, 09:20
PM MAIL   Вверх
Rezzonans
Дата 16.6.2006, 09:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 145
Регистрация: 21.4.2005

Репутация: нет
Всего: нет



Icaros, помоему это велосипед. Пиши программу на си! Будет конечно сложнее, чем на пхп, зато и результат будет более чем ощутимым! Другого выхода (за исключением доработки алгоритма) при помощи CGI я не вижу, perl не на много быстрее пхп будет! 
--------------------
Первый детектор лжи был собран из ребра мужчины. Впрочем, до сих пор, никаких изменений не притерпел
PM MAIL   Вверх
skyboy
Дата 16.6.2006, 09:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: нет
Всего: 260



Icaros, есть такая вещь, как профайлеры. Исследуй одним из таких свою программу. Основное-то время тратися, может, и на рассчёты... Но кто знает, может там есть ещё "узкие" места, о которых ты и не догадываешься и коорые можно оптимизировать, не затрагивая(пока что!) алгоритм. 
PM MAIL   Вверх
sharq
Дата 16.6.2006, 10:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Perl Liker
**


Профиль
Группа: Участник
Сообщений: 841
Регистрация: 13.12.2004
Где: Ростов-на-Дону

Репутация: 2
Всего: 28



Rezzonans, 
Цитата(Rezzonans @  16.6.2006,  10:33 Найти цитируемый пост)
perl не на много быстрее пхп будет!  

вот это ты сказал. Все дело в алгоритме. 
Алгоритм на Perl будет быстрей работать, чем аналогичный на PHP, но наверня-ка будет уступать алгоритму на Cи.
Увеличить скорость работы CGI - это просто (FastCGI, mod_perl, ...).

 smile  


--------------------
[color=gray]There's More Than One Way To Do It[/color]
PM MAIL WWW ICQ Skype   Вверх
FunnyFalcon
Дата 28.6.2006, 13:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 76
Регистрация: 27.3.2006

Репутация: нет
Всего: 7



Люди!!! Не забывайте, что CGI - это не только perl. Программа на C (написанная соответственно) тоже имеет право носить гордое имя CGI - и скорее всего именно это и советовали Icaros. 
PS. Если не хочешь лезть в С попробуй Python или (что еще быстрее) Lua (www.lua.org)(www.keplerproject.org). 
Они менее удобны, но для счетных задач намного быстрее (особенно Lua).

Добавлено @ 13:52 
Код

#!/usr/local/bin/lua

print('Content-type: text/html')
print()
print('Hello Guys!!!')
for _, k in pairs({'DOCUMENT_ROOT','HTTP_ACCEPT','HTTP_HOST','QUERY_STRING','PATH',
             'REMOTE_ADDR','REMOTE_PORT','REQUEST_METHOD','REQUEST_URI',
             'SCRIPT_FILENAME','SCRIPT_NAME','PATH_INFO','PATH_TRANSLATED'}) do
    print(k, '-', os.getenv(k),'<br />')
end


Запрос: http://base/cgi-bin/test.lua/test?sdf=4
Ответ:
Код

Hello Guys!!! DOCUMENT_ROOT - /var/www/local
HTTP_ACCEPT - text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5
HTTP_HOST - base
QUERY_STRING - sdf=4
PATH - /sbin:/usr/sbin:/bin:/usr/bin:/usr/local/bin
REMOTE_ADDR - 192.168.0.2
REMOTE_PORT - 40804
REQUEST_METHOD - GET
REQUEST_URI - /cgi-bin/test.lua/test?sdf=4
SCRIPT_FILENAME - /var/www/local-cgi-bin/test.lua
SCRIPT_NAME - /cgi-bin/test.lua
PATH_INFO - /test
PATH_TRANSLATED - /var/www/local/test 
 
PM MAIL   Вверх
aksined
Дата 29.6.2006, 12:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 58
Регистрация: 26.12.2005

Репутация: нет
Всего: 1



А так не делают, и если нет, то почему?

положим, писать на с или vb cgi-программу от и до не очень хочется. 
сейчас есть программа, написанная на vb, которая устаривает нас по скорости. Почему бы не написать к ней веб интерфейс на пхп или перл? На них, подозреваю, проще сделать разбор пользовательского ввода, если он есть, и вывод результатов. А между ними - вызов vb с помощью ipc. 
PM MAIL   Вверх
Rezzonans
Дата 30.6.2006, 01:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 145
Регистрация: 21.4.2005

Репутация: нет
Всего: нет



sharq, говорю про php версии 5, и выше. На данном этапе получается что php не на много уступает перлу, за исключением только выполнения достаточно долгих циклов, но это устранимо в дальнейшем, как я понял 
--------------------
Первый детектор лжи был собран из ребра мужчины. Впрочем, до сих пор, никаких изменений не притерпел
PM MAIL   Вверх
FunnyFalcon
Дата 30.6.2006, 19:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 76
Регистрация: 27.3.2006

Репутация: нет
Всего: 7



PM MAIL   Вверх
geckelberryfinn
Дата 14.8.2006, 17:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 65
Регистрация: 3.12.2003

Репутация: нет
Всего: нет



Обязательно методом Фурье? Может разностной схемой бухнуть? Ряды, получающиеся в методе фурье могут довольно долго сходиться. 
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Perl: CGI программирование"
korob2001
sharq
  • В этом разделе обсуждаются вопросы относящиеся только к CGI программированию
  • Если ваш вопрос не относится к системному или CGI программированию, задавайте его в общем разделе
  • Если ваш вопрос относится к системному программированию, задавайте его здесь
  • Интерпретатор Perl можно скачать здесь ActiveState, O'REILLY, The source for Perl
  • Справочное руководство "Установка perl-модулей", качать здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Perl: разработка для Web | Следующая тема »


 




[ Время генерации скрипта: 0.0613 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.