Почему этот Perl требует, чтобы линия занимала так много времени? - PullRequest
1 голос
/ 16 ноября 2009

У меня есть сценарий Perl, который запускается с помощью команды system() из C. На определенном сайте (SunOS 5.10), когда этот сценарий выполняется, это почти всегда занимает 6 секунд или более. На других сайтах он запускается практически мгновенно (0,1 с). Если я запускаю скрипт вручную, т.е. не из кода C, он также запускается мгновенно. В конце концов я отследил медлительность (выплевывая время целую кучу во многих разных местах), до одной require строки. Требуемый файл - это еще один Perl-скрипт, который мы написали. Сценарий состоит из одного require (этот файл здесь ), 3 скаляров, которым назначены целочисленные значения, и нескольких процедур преобразования времени / даты. Файл заканчивается на 1 ;. Это единственное требование, по-видимому, занимает целых 6 секунд, но, как я уже сказал, не всегда даже на одной машине. Я абсолютно в тупике. Моя единственная последняя мысль - включить профилирование, но на сайте нет Devel :: Profiler, и мой единственный другой вариант (о котором я знаю) - добавить его в команду Perl, что потребует от меня изменения и перекомпиляции C код (выполнимый, но нетривиальный).

У кого-нибудь есть ЛЮБАЯ идея, что здесь может происходить? Я не думаю, что могу / хочу поместить весь date.pl, который требуется, но это в значительной степени точно так, как я описал; Я мог бы ответить на любые ваши вопросы об этом.

Заранее спасибо.

Ответы [ 3 ]

5 голосов
/ 16 ноября 2009

Вас может заинтересовать Своевременное начало Жана-Луи Леруа. У него была похожая проблема, и он проследил ее до длинного и глубокого пути поиска модулей, где perl обычно находил модули в последних записях в @INC.

3 голосов
/ 16 ноября 2009

Шесть секунд - это долго. Вы проверили, что ваша сеть делает во время этого? Моя первая мысль была о том, что порождение нового процесса при использовании команды system () может быть проблемой, но шесть секунд это слишком долго. Я не очень разбираюсь в Perl, но могу представить, что по любой причине доступ к модулю времени может вызвать вызов к сетевому серверу времени. Просто чтобы синхронизироваться. Может быть, это занимает так много времени или, может быть, это время ожидания. Может случиться так, что это происходит только для недавно порожденного процесса - следовательно, только когда вы используете команду system ().

просто дикие догадки ...

1 голос
/ 17 ноября 2009

Итак, это ничего не дает для прямого ответа на ваш вопрос, но, пожалуйста, скажите, что вы на самом деле не используете на Perl 4? Предполагая, что вы используете Perl 5, вы можете удалить весь файл и заменить требуемый на use POSIX qw(ctime), чтобы получить версию, которая поставляется с Perl.

Если вам действительно нужна поддержка perl4, я просто ворчу о том, что версии 5 пятнадцать лет сейчас и уйду. :)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...