Модераторы: ginnie, korob2001
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> if () {} сильно влияет на скорость, как обойти?? 
:(
    Опции темы
loginn
Дата 24.8.2011, 11:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 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 () {} может так сильно тормозить скрипт?????

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

PM MAIL   Вверх
DurRandir
Дата 24.8.2011, 13:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 335
Регистрация: 27.9.2009

Репутация: нет
Всего: 17



Поставьте нормальный профилировщик - Devel::NYTProf, и посмотрите на его вывод.
PM   Вверх
loginn
Дата 24.8.2011, 15:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 29
Регистрация: 22.12.2010

Репутация: нет
Всего: нет



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

Но все же, почему операция  if ($scalar) {} занимает гораздо больше времени, нежели if (exists $hash{key1}) {} ?
PM MAIL   Вверх
DurRandir
Дата 24.8.2011, 16:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 335
Регистрация: 27.9.2009

Репутация: нет
Всего: 17



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

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

Это сообщение отредактировал(а) DurRandir - 24.8.2011, 16:36
PM   Вверх
loginn
Дата 25.8.2011, 16:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 29
Регистрация: 22.12.2010

Репутация: нет
Всего: нет



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

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Perl: Системное программирование"
korob2001
sharq
  • В этом разделе обсуждаются вопросы относящиеся только к системному программированию на Perl
  • Если ваш вопрос не относится к системному или CGI программированию, задавайте его в общем разделе
  • Если ваш вопрос относится к CGI программированию, задавайте его здесь
  • Интерпретатор Perl можно скачать здесь ActiveState, O'REILLY, The source for Perl
  • Справочное руководство "Установка perl-модулей", можно скачать здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Perl: Системное программирование | Следующая тема »


 




[ Время генерации скрипта: 0.0447 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.