![]() |
|
Модераторы: ginnie, korob2001 |
![]()
|
|
| loginn |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 29 Регистрация: 22.12.2010 Репутация: нет Всего: нет |
Всем доброго дня!!
Столкнулся с такой проблемой. Есть файл на много миллионов строк. Причем файл на 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 |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 335 Регистрация: 27.9.2009 Репутация: нет Всего: 17 |
Поставьте нормальный профилировщик - Devel::NYTProf, и посмотрите на его вывод.
|
|||
|
||||
| loginn |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 29 Регистрация: 22.12.2010 Репутация: нет Всего: нет |
Попробовал я Devel::NYTProf. Но он не вывел мне время для цикла while().
Он только показывал время подпрограмм из модулей, подключаемых в use и время выполнения системных функций: типо fork() и т.д. Но все же, почему операция if ($scalar) {} занимает гораздо больше времени, нежели if (exists $hash{key1}) {} ? |
|||
|
||||
| DurRandir |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 335 Регистрация: 27.9.2009 Репутация: нет Всего: 17 |
А маны мне за вас читать?) Он настраивается так, чтобы считать время выполнения каждой строчки (причём это включено по умолчанию):
NYTPROF=stmts=1 perl -d:NYTProf script.pl PS: по вашему коду вообще не понятно, о каких хешах речь. В приведённой отрывке нет 3х уровнего хеша. Ну и вы каждый раз их по разному называете. Я могу погадать на кофейной гуще, что у вас таких ключей никогда нет, и вы нарываетесь на autovivification, когда получаете значение, а когда проверяете по exists - нет. Это сообщение отредактировал(а) DurRandir - 24.8.2011, 16:36 |
|||
|
||||
| loginn |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 29 Регистрация: 22.12.2010 Репутация: нет Всего: нет |
я разобрался. я забыл написать об очень важной детали: у меня используются потоки, и хэш и его подхэши шарятся между ними.
как только я отключил share() и перестал использовать потоки, то скорость сразу же выросла. |
|||
|
||||
![]()
|
| Правила форума "Perl: Системное программирование" | |
|
|
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Perl: Системное программирование | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |