Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Perl: Системное программирование > if () {} сильно влияет на скорость, как обойти??


Автор: loginn 24.8.2011, 11:37
Всем доброго дня!!
Столкнулся с такой проблемой.

Есть файл на много миллионов строк. Причем файл на RAM диске!

Я его построчно обрабатываю. Столкнулся с маленькой скоростью обработки. Решил методом последовательно наращивания функциональных блоков в коде, выявить, какой участок кода сильнее всего вызывает "проседание скорости". И практически сразу же я наткнулся на такой результат:

Вот код:

  $timestamp_begin = time();

  while ($var0=<$file>) { 

    ($var1, $var2, $var3, $var4, $var5, $var6) = split (/::/, $var0);
    ($var8, $var9, $var10) = split (/\s/, $var3);
   
    $timestamp_msec = time();
    $time_elapsed = $timestamp_msec - $timestamp_begin;
    
    #####Check client exisits in hash
    #if ($clients{$client1})  {
         $perfomance{total_requests}++;
         if ($time_elapsed){
           $speed = int ($perfomance{total_requests}/$time_elapsed);
           print "\r$speed";
         }
    #}
  } die "recv: $!";

До того как я раскомментил if ($clients{$site}{turners}{prepacker})  {  и закрывающую скобку }  
скорость была примерно такой: 79255.

После того как я раскомментил if ($clients{$site}{turners}{prepacker})  {  и закрывающую скобку }
скорость просела до 48504...

Че-то я не втыкаю, неужели всего одна операция if () {} может так сильно тормозить скрипт?????

У кого какие соображения есть по этому поводу?

Автор: DurRandir 24.8.2011, 13:20
Поставьте нормальный профилировщик - Devel::NYTProf, и посмотрите на его вывод.

Автор: loginn 24.8.2011, 15:27
Попробовал я Devel::NYTProf. Но он не вывел мне время для цикла while().
Он только показывал время подпрограмм из модулей, подключаемых в use и время выполнения системных функций: типо fork() и т.д.

Но все же, почему операция  if ($scalar) {} занимает гораздо больше времени, нежели if (exists $hash{key1}) {} ?

Автор: DurRandir 24.8.2011, 16:32
А маны мне за вас читать?) Он настраивается так, чтобы считать время выполнения каждой строчки (причём это включено по умолчанию):
NYTPROF=stmts=1 perl -d:NYTProf script.pl

PS: по вашему коду вообще не понятно, о каких хешах речь. В приведённой отрывке нет 3х уровнего хеша. Ну и вы каждый раз их по разному называете. Я могу погадать на кофейной гуще, что у вас таких ключей никогда нет, и вы нарываетесь на autovivification, когда получаете значение, а когда проверяете по exists - нет.

Автор: loginn 25.8.2011, 16:56
я разобрался. я забыл написать об очень важной детали: у меня используются потоки, и хэш и его подхэши шарятся между ними.
как только я отключил share() и перестал использовать потоки, то скорость сразу же выросла.

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