![]() |
Модераторы: korob2001, ginnie |
![]() ![]() ![]() |
|
Сisa |
|
||||
Бывалый ![]() Профиль Группа: Участник Сообщений: 179 Регистрация: 18.1.2013 Репутация: нет Всего: нет |
Обычно в начале кода пишем все use.
А лучше ли такая запись:
или без разницы? т.е. при компиляции будут просмотрены все use, независимо от того где они расположены и никакого ускорения работы кода такая запись не даст? |
||||
|
|||||
arto |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1495 Регистрация: 31.10.2004 Репутация: 38 Всего: 40 |
если необходимо загружать модуль во rt, то используйте require (perldoc -f use).
|
|||
|
||||
Сisa |
|
|||
Бывалый ![]() Профиль Группа: Участник Сообщений: 179 Регистрация: 18.1.2013 Репутация: нет Всего: нет |
perldoc -f use - там так мелко написано (в смысле по английски) что конкретно на вопрос ответа как бы и не нашел.
require URI::Escape; меняет ситуацию по сравнению с use URI::Escape; т.е. загрузка модуля делаться теперь должна в момент вызова, и следует ли это понимать как полезное действие? Будет ли скрипт компилироваться, да и выполняться быстрее? В примере подключается один модуль, но их же может быть более чем один. Конечно можно делать замеры времени, вряд ли они покажут истину, да и сам вопрос скорее теоретический. |
|||
|
||||
arto |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1495 Регистрация: 31.10.2004 Репутация: 38 Всего: 40 |
непонятна ваша задача.
|
|||
|
||||
Сisa |
|
|||
Бывалый ![]() Профиль Группа: Участник Сообщений: 179 Регистрация: 18.1.2013 Репутация: нет Всего: нет |
Минимизировать время на выполнение perl-кода за счет экономии времени на компиляции и отсутствии излишнего подключения незадействованных модулей в случае если таковые модули в ходе выполнения скрипта не будут использованы.
Проще говоря - попытка ускорить скрипт ![]() |
|||
|
||||
noize |
|
||||
![]() 5.18.2 ![]() Профиль Группа: Участник Сообщений: 89 Регистрация: 10.7.2010 Где: СПб Репутация: 3 Всего: 3 |
1. Можно подгружать модуль через use не импортируя из него автоматически импортируемые данные. Для этого в своём коде пишете
но это вряд ли сильно ускорит ваш скрипт. Если хочется найти узкие места, см. п. 2 2. Используйте Devel::NYTProf для профилирования своего скрипта. В итоге увидите, где у вас узкие места, которые долго выполняются. |
||||
|
|||||
Сisa |
|
|||
Бывалый ![]() Профиль Группа: Участник Сообщений: 179 Регистрация: 18.1.2013 Репутация: нет Всего: нет |
noize спасибо!
Попробую освоить такую новинку. но, https://metacpan.org/pod/Devel::NYTProf : ОПИСАНИЕ, п.11 : Sub-мкс (100 нс) Разрешение на поддерживаемых системах мкс, нс - замеры времени, но не тактов, а компиляция быстра, и делается она ведь до того как, т.е. до того как начнет выполняться perl-скрипт, конечно если подобрать соответствующий тестовый код, то может быть он покажет разницу. Такой тест придется выполнять на ПК, не на сервере. А почему не так: если модуль не нужен, и не загружается т.е. и не компилируется, то время на это не расходуется? Разница в том что use всегда, даже если и записана в неиспользуемой ветке кода, загружает модуль, а require подключает модуль только если записан в используемой части кода. Если модуль загружается, то он компилируется. А если не загружается, то вот и экономия времени и на загрузке и на компиляции модулей. Это как бы и не поиск узких мест, которые долго выполняются, но возможно ли вообще обойтись без их обязательного выполнения. Отсюда и возник вопрос: А лучше ли вторая запись из примера. Такая перестановка и правда вряд ли сильно ускорит скрипт, но сознание того что именно так правильно и так лучше ...?!?!?!?!? |
|||
|
||||
odmink0 |
|
|||
Новичок Профиль Группа: Участник Сообщений: 10 Регистрация: 7.4.2010 Где: Рязань Репутация: нет Всего: нет |
Лучше такая запись:
Читайте Perl Advent Calendar, друзья! ![]() http://perladvent.org/2014/2014-12-12.html |
|||
|
||||
Pfailed |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 933 Регистрация: 19.7.2009 Репутация: 22 Всего: 39 |
use загрузит модуль в любом случае на этапе компиляции, require - во время выполнения. Не загружая ненужный модуль можно, конечно, сэкономить какие-то микросекунды и память. Но главный минус require в отдельной ветке, на мой взгляд, это то, что при невозможности загрузить модуль скрипт свалится во время выполнения, что не всегда хорошо. Лучше уж пусть падает сразу при попытке запуска.
Поэтому обычно вначале скрипта загружают все нужные модули через use/require. А во время выполнения какие-то опциональные через eval{require}, без которых скрипт может работать. Например:
|
|||
|
||||
alezzz |
|
|||
![]() сплю... ![]() ![]() Профиль Группа: Участник Сообщений: 499 Регистрация: 17.8.2009 Репутация: 1 Всего: 14 |
почему я получаю варнинг 'Name "main::Dumper" used only once' и модуль не подключается? |
|||
|
||||
Сisa |
|
|||
Бывалый ![]() Профиль Группа: Участник Сообщений: 179 Регистрация: 18.1.2013 Репутация: нет Всего: нет |
Perl Advent Calendar оказывается примерно в это же время, чуть раньше не считается, об этом тоже почему то написал
![]() use if defined $query, 'URI::Escape', qw(uri_escape); строка уже и не в начале кода, как все use, но тем не менее это видимо и есть лучшее решение, хотя и так тоже неплохо: if(defined $query){use URI::Escape;...}else{... модуль не нужен}, надеюсь форма записи не сильно меняет суть действия. Pfailed спасибо! Если можно, то нужно! экономить микросекунды и память. Конечно мелочь, но все же принцип, что все возможные пути надо использовать, будет соблюден. А тестировать, что с use, что с require все равно ведь надо, чтобы скрипт не валится во время работы. |
|||
|
||||
noize |
|
|||
![]() 5.18.2 ![]() Профиль Группа: Участник Сообщений: 89 Регистрация: 10.7.2010 Где: СПб Репутация: 3 Всего: 3 |
модуль подключается. Но require скорее всего не делает Module->import автоматом в отличие от use. Добавлено через 1 минуту и 17 секунд Сisa, что у вас там за приложение такое, для которого необходимо экономить ресурсы на старте? Perl - это не Java, он стартует почти мгновенно |
|||
|
||||
alezzz |
|
||||||
![]() сплю... ![]() ![]() Профиль Группа: Участник Сообщений: 499 Регистрация: 17.8.2009 Репутация: 1 Всего: 14 |
noize, похоже что так и есть, из документации не понял, т.к. английский далеко не идеальный, но на каком-то сайте примерно так и пишут, что не импортирует.
работает так:
но результат:
тогда как при use Data::Dumper результат:
|
||||||
|
|||||||
Pfailed |
|
||||||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 933 Регистрация: 19.7.2009 Репутация: 22 Всего: 39 |
alezzz, Вот так сработает
или так
При использовании "->" первым аргументом в функцию передаётся имя пакета, на котором был вызван метод, что собственно и видно. А нижеследующее (Dumper без скобок )не работает. Но если использовать use, то работает. И тут дело в прототипах, которые perl может вычислить на этапе компиляции. Т.е. при использовании use perl на этапе компиляции узнал, что есть такая функция Dumper() и распарсил выражение "print Dumper $a", как "print(Dumper($a))". А при использовании require на этапе компиляции про Dumper() ничего неизвестно, поэтому perl распарсил это выражение как "print(Dumper $a)". Т.е. печать в файлхэндл Dumper.
|
||||||
|
|||||||
Сisa |
|
|||
Бывалый ![]() Профиль Группа: Участник Сообщений: 179 Регистрация: 18.1.2013 Репутация: нет Всего: нет |
"Сisa, что у вас там за приложение такое, для которого необходимо экономить ресурсы на старте? Perl - это не Java, он стартует почти мгновенно"
А что Java такой тормоз ? Значит следующим буду учить ассемблер ![]() Вот где то прочел, что может быть применено к моему вопросу: "Я заостряю на этом внимание оттого, что слишком много начинающих программистов хватаются за эффективность даже в мелочах. Результат получается больше, сложнее и часто не без ошибок. Такие программы дольше писать, а работают они часто не сильно быстрее." Просто ответ на вопрос мне был интересен. |
|||
|
||||
![]() ![]() ![]() |
Правила форума "Perl" | |
|
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Perl: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |