Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Perl: разработка для Web > Оптимизация архитектуры больших CGI скриптов


Автор: PerlMaster 3.2.2003, 08:58
Исходные данные
Есть большой 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
Я не ослышался? Компиляцию? Тогда батенька пишите на с++, ибо прога после компиляции, написанная на Perl и содержащая один цикл у меня весила более одного метра. Perl - язык интерпретируемый. И не стоит нарушать установившиеся стандарты...
Далее, возникнут с мод_перлом, т.к. при изменении модуля - кеш сервяка не выгружается, потому сервер не будет исползовать нормально новую версию модуля. А это значит - все модули должны находится в одном файле...
Так что думай, все зависит от конкретной задачи...

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


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

Когда я делал подобные вещи на перл, то я использовал Решение №1.

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

2 Admin: спасибо за информацию.

Автор: Unregistered 5.2.2003, 19:03
PerlMaster
Вах, вах, вах...
Можно спрасить а во что он компили модуль? И что вы понимаете тогда под словом компиляция. Советую вам думать, прежде чем писать. Повторяю вам еще раз. Perl - язык интпретируемый. mod_perl - уже не совсем. Однако не о нем была заведенна речь. А то есл судить - то бейсик - это тоже компилируемый язык biggrin.gif.
Впреди внимательней читайте ;)

Автор: PerlMaster 6.2.2003, 11:09
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.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)