| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > 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() и перестал использовать потоки, то скорость сразу же выросла. |