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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Оптимизация архитектуры больших CGI скриптов, есть решения, нужны мнения 
:(
    Опции темы
PerlMaster
  Дата 3.2.2003, 08:58 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Исходные данные
Есть большой CGI скрипт следующей структуры:
if ($action eq "action1") {
# много кода
...
&sub1();
...
&sub2();
...
&sub3();
...
} elsif ($action eq "action2") {
# много кода
...
&sub4();
...
&sub5();
...
&sub6();
...
} elsif ($action eq "action3") {
....



Цели:
1) Минимизировать время на компиляцию кода
2) Минимизировать память для хранения откомпилированных модулей
3) Совместимость с mod_perl (желательно)


Решение 1: вынести код в модули, затем подгружать их по мере надобности с помощью "require 'actionX.pl'".
Скрипт примет следующий вид:
if ($action eq "action1") {
require "action1.pl";
&action1();
} elsif ($action eq "action2") {
require "action2.pl";
&action2();
} elsif ($action eq "action3") {
....

Чего мы добились:
Оптимизировали время и память

Недостатки решения 1:
1) Несовместимость с mod_perl: require при 2-м вызове скрипт не будет
импортировать в пространство "main::" имена функций из модулей "actionN.pl"
2) Невозможность использовать use strict

Решение 2: вынести код в модули, затем подгружать их по мере надобности
с помощью "require Module;" или eval("use Module").
Скрипт примет следующий вид:
if ($action eq "action1") {
eval("use Action1");
&Action1::action1();
} elsif ($action eq "action2") {
eval("use Action2");
&Action2::action2();
} elsif ($action eq "action3") {
....

Чего мы добились:
1) Оптимизировали время и память
2) Добились совместимости с mod_perl

Недостатки решения 2:
1) Огромные затраты времени на переписывание всего
скрипта с учетом новых пространств имен.
2) Более громоздкая запись глобальных переменных и глобальных функций.
3) Невозможность использовать use strict.



Есть у кого соображения по усовершенствованию предложенных решений, или же принципиально новые решения ?
  Вверх
Nekto
Дата 5.2.2003, 00:35 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Я не ослышался? Компиляцию? Тогда батенька пишите на с++, ибо прога после компиляции, написанная на Perl и содержащая один цикл у меня весила более одного метра. Perl - язык интерпретируемый. И не стоит нарушать установившиеся стандарты...
Далее, возникнут с мод_перлом, т.к. при изменении модуля - кеш сервяка не выгружается, потому сервер не будет исползовать нормально новую версию модуля. А это значит - все модули должны находится в одном файле...
Так что думай, все зависит от конкретной задачи...
  Вверх
Wowa
Дата 5.2.2003, 00:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
Group Icon


Профиль
Группа: Админ
Сообщений: 15017
Регистрация: 14.9.2000
Где: Винград

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



Цитата
Далее, возникнут с мод_перлом, т.к. при изменении модуля - кеш сервяка не выгружается, потому сервер не будет исползовать нормально новую версию модуля. А это значит - все модули должны находится в одном файле...


хм, насколько я знаю, проблем с кешированием при использовании mod_perl - вообще никогда не возникает.

Когда я делал подобные вещи на перл, то я использовал Решение №1.
PM WWW   Вверх
PerlMaster
Дата 5.2.2003, 06:11 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











2 Nekto:
Да, перл компилирует модуль перед выполнением, если ты не знал (не в машинный код, конечно).
В дальнейшем советую не вступать в дискуссии по темам, в которых не разбираешься. Это вредит репутации.

2 Admin: спасибо за информацию.
  Вверх
Unregistered
Дата 5.2.2003, 19:03 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











PerlMaster
Вах, вах, вах...
Можно спрасить а во что он компили модуль? И что вы понимаете тогда под словом компиляция. Советую вам думать, прежде чем писать. Повторяю вам еще раз. Perl - язык интпретируемый. mod_perl - уже не совсем. Однако не о нем была заведенна речь. А то есл судить - то бейсик - это тоже компилируемый язык biggrin.gif.
Впреди внимательней читайте ;)
  Вверх
PerlMaster
Дата 6.2.2003, 11:09 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











2 Nekto (Unregistered):
Читаем очень внимательно:
http://www.perl.com/doc/FMTEYEWTK/comp-vs-interp.html

Теперь понятно, что слово "compilation" в зависимости от контекста может иметь разные значения?
В контексте C++ - это создание последовательности инструкций процессора, а в контексте Perl - это посторение синтаксического дерева.

The perl executable you are using has two distinct stages. First comes the frontend, which is certainly a compiler of sorts. It compiles your perl program source into a parse tree.
  Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Perl: CGI программирование"
korob2001
sharq
  • В этом разделе обсуждаются вопросы относящиеся только к CGI программированию
  • Если ваш вопрос не относится к системному или CGI программированию, задавайте его в общем разделе
  • Если ваш вопрос относится к системному программированию, задавайте его здесь
  • Интерпретатор Perl можно скачать здесь ActiveState, O'REILLY, The source for Perl
  • Справочное руководство "Установка perl-модулей", качать здесь


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

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


 




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


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

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