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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Скорость работы скрипта, Способы ускорить программу 
:(
    Опции темы
MakTpaxep
  Дата 7.6.2011, 14:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Ясно что интерптетатор работает медленнее откомпиленного кода.
Пришлось выбирать между скоростью разработки на perl и скоростью обработки здоровых файлов на c++.
Какие способы есть ускорить выполнение?

Первой мыслью было сделать независимый ехе.
Нашёл http://www.indigostar.com/perl2exe.php.
Подобрал под свою версию - конвертнуло, но при запуске пусто (сделал простой print "hi").
Попробовал другой версией - ошибки.
Кто-нибудь вообще пользовался этой крутейшей штукой? 
Я готов попариться ещё, но интересно намного ли станет быстрее?

Есть ли ещё какие-либо способы?

Кстати я так понял, что хэш в perl, вообще на парится о скорости доступа, а он у меня ипользуется.
Поищу как я ему замену..

Это сообщение отредактировал(а) MakTpaxep - 7.6.2011, 14:25
PM MAIL   Вверх
sir_nuf_nuf
Дата 7.6.2011, 14:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



MakTpaxep, числа в студию.  Иначе все размышления - не имеют ценности.

У меня вот есть такие соображения
1) perl упакованный в exe будет не быстрее обычного скрипта, т.к. настоящей компиляции не происходит.
Только упаковка того же самого интерпретатора и скрипта в 1 файл. Максимум - съэкономите копейки на парсинге скрипта.
2) perl хеши - довольно быстрые, т.к. написаны на С, отлаживаются и улучшаются уже более 20 лет. 
Скорее всего время уходит не доступ к хешу а на что то еще..
Например на подготовку ключа:
Код

$hash{ "prefix_" . $id } = 1;



Есть способ - сделать профилирование (Devel::NYTProf)  скрипта и посмотреть на что уходит время.


--------------------
user posted image
user posted image
PM MAIL Jabber   Вверх
afiskon
Дата 7.6.2011, 14:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 294
Регистрация: 31.3.2011
Где: Россия, Москва

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



Цитата

Ясно что интерптетатор работает медленнее откомпиленного кода.


Сколько не компилируй сортировку пузырьком, скриптовая быстра сортировка более эффективна ;)
Цитата

Первой мыслью было сделать независимый ехе.

Плохая мысль. Все эти генераторы perl -> exe просто сжимают ваш скрипт и цепляют архив к интерпретатору.
Цитата

Кстати я так понял, что хэш в perl, вообще на парится о скорости доступа

Представляет собой обычное красно-черное дерево в памяти. В C++ map точно так же реализован.
Цитата

скоростью обработки здоровых файлов

Если вы углубитесь в историю создания Perl, то откроете, что этот язык как раз создавался для обработки больших объемов данных. Способы ускорения существуют, можете почитать о них (извините за самопиар) в этой заметке. Еще там есть несколько заметок про многопоточность.
PM MAIL WWW   Вверх
EcSYZ
Дата 7.6.2011, 14:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



В заметке не нашёл вообще ничего, хоть как то связанного с ускорением.
Не знаю для чего там создавался перл, но на больших файлах он уже не особо быстро работает.
У меня есть скрипт, который разбирает кучу файлов с помощью регулярок. После многих тестов и сравнений, я заменил весь разбор файлов с перла на bash+cat+egrep. В итоге то что делалось на перле минуты 3 сократилось секунд до 10-20(но точных цифр я не помню, хотя эти не сильно далеки от истины).

Это сообщение отредактировал(а) EcSYZ - 7.6.2011, 14:55
PM MAIL WWW   Вверх
MakTpaxep
Дата 7.6.2011, 14:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Цитата(afiskon @  7.6.2011,  14:40 Найти цитируемый пост)
Представляет собой обычное красно-черное дерево в памяти. В C++ map точно так же реализован.

а я чёто думал что АВЛ. Ну да фиг с ним
Цитата(afiskon @  7.6.2011,  14:40 Найти цитируемый пост)
Если вы углубитесь в историю создания Perl, то откроете, что этот язык как раз создавался для обработки больших объемов данных.

А я думал что для небольших, но хитрозамученных отчётов) Реги действительно ускоряют работу в десятки раз, по сравнению с плюсами. Но на плюсах всё таки написанный код будет быстрее. Скоро сам заморочусь и проверю.
Цитата(afiskon @  7.6.2011,  14:40 Найти цитируемый пост)
Способы ускорения существуют, можете почитать о них (извините за самопиар) в этой заметке. Еще там есть несколько заметок про многопоточность.

Пост нештяк, но я к вебу пока что никакого отношения не имею) У меня xml, ну или если хотите txt.
Обработка идёт почти час!! Два файла метров по 13, получаются метров под 50. 
Цитата(sir_nuf_nuf @  7.6.2011,  14:35 Найти цитируемый пост)
Есть способ - сделать профилирование (Devel::NYTProf)  скрипта и посмотреть на что уходит время.

Спасибо, я погляжу.
Цитата

bash+cat+egrep.

Тоже гляну что за зверь эдакий)

Это сообщение отредактировал(а) MakTpaxep - 7.6.2011, 14:58
PM MAIL   Вверх
arto
Дата 7.6.2011, 15:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1495
Регистрация: 31.10.2004

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



> После многих тестов и сравнений, я заменил весь разбор файлов с перла на bash+cat+egrep. В итоге то что делалось на перле минуты 3 сократилось секунд до 10-20

можно-ли увидеть скрипт?
PM MAIL ICQ   Вверх
EcSYZ
Дата 7.6.2011, 15:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



К сожалению - нельзя.
Это не совсем скрипт, скорее один проект, которым я занимаюсь.
Через веб загружался файл и после чего парсился, так что надо было свести к минимуму время парсинга.
Сначала у меня был цикл с кучей лишних регулярок и проверок, потом я его подправил и всемя сократилось вполне весомо. Но всё равно работало медленно, так что в поисках счастья я направился к bash, и сделал простой такой код:
Код

my $cmd = sprintf('cat "%s" | egrep -i "(%s)" > "%s"', $in_file, $pattern, $out_file);
`$cmd`;

который меня вполне обрадовал. Может позже руки дойдут и перепишу это на чистом c++, но пока некогда.
PM MAIL WWW   Вверх
KSURi
Дата 7.6.2011, 16:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(afiskon @  7.6.2011,  14:40 Найти цитируемый пост)
Представляет собой обычное красно-черное дерево в памяти. В C++ map точно так же реализован.

Структура данных для хешей так и называется - хеш-таблица. Внутри реализована с помощью связных списков.


--------------------
Died at Life.pl line 21
PM Jabber   Вверх
arto
Дата 7.6.2011, 16:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1495
Регистрация: 31.10.2004

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



очень странно.

# a=$( date +"%s" ); find /usr/share -type f -print | xargs cat | egrep "(AAA|BBB|CCC)" &> /dev/null; print $[ $( date +"%s" )-$a ] 
131
# a=$( date +"%s" ); find /usr/share -type f -print | xargs cat | perl -ne "m#(?:AAA|BBB|CCC)# && print" &> /dev/null; print $[ $( date +"%s" )-$a ]
102
#

мне кажется, что вы что-то недоговариваете.
регулярное выражение можете привести?
PM MAIL ICQ   Вверх
EcSYZ
Дата 7.6.2011, 17:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Хм, щас по новой прогнал разбор файлов.
По результатам получилось что перл был быстрее на 5 сек.
Х\з в чём прикол, может разница между 5.10 и 5.12.
Так что я признаю что щас перл по тестам быстрее, но от слов, что когда я это мутил bash был в разы быстрее я не собираюсь отказываться  smile 
PM MAIL WWW   Вверх
afiskon
Дата 7.6.2011, 17:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 294
Регистрация: 31.3.2011
Где: Россия, Москва

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



Цитата

а я чёто думал что АВЛ

Почти то же самое. На самом деле, реализация остается на усмотрение разработчика конкретной версии STL, но из того, что я слышал, почти везде используются RB-деревья.

Цитата

Структура данных для хешей так и называется - хеш-таблица. Внутри реализована с помощью связных списков.

Точно. Как я мог так заблуждаться! Раз ассоциативные массивы в Perl еще называют хэши, значит (о я дурааак!) и реализованы они на хэш-таблицах. Ага. Главное - сильно-сильно в это верить smile 
PM MAIL WWW   Вверх
KSURi
Дата 7.6.2011, 17:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Можно верить, а можно почитать соответствующие источники и убедиться самому.
Сарказм не к месту, т.к., действительно, не зря они называются хешами, а не ассоциативными массивами.


--------------------
Died at Life.pl line 21
PM Jabber   Вверх
sir_nuf_nuf
Дата 7.6.2011, 18:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Можно поступить даже проще
Код

print scalar %ENV;

Напечатает что то вроде 32/64.
Это соотношнение занятых и выделеных bucket (корзин) - структура которая имеет смысл только для хеш таблиц.

Это сообщение отредактировал(а) sir_nuf_nuf - 7.6.2011, 18:05


--------------------
user posted image
user posted image
PM MAIL Jabber   Вверх
MakTpaxep
Дата 7.6.2011, 18:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



А как дела обстоят с повторной перекомпиляцией кода? Интерпретатор перекомпиливает одни и теже участки кода и реги по несколько раз? Если этого избегать, то разница в скорости не должна особо ощущаться. (Я чёто только сейчас задумался а так ли это - в голове вроде всегда было что скрипты это jit компиляция, потому медленнее).

Написал, потом подумал называется=(

Это сообщение отредактировал(а) MakTpaxep - 7.6.2011, 18:55
PM MAIL   Вверх
Pfailed
Дата 7.6.2011, 20:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



MakTpaxep, регулярные выражения перекомпилируются только если в них содержится переменная и не указан модификатор /o


--------------------
PM MAIL   Вверх
kavkaz
Дата 10.6.2011, 15:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Разгонять perl скрипт можно.
Не сказать, что можно выиграть на порядок в скорости (ну, если там не совсем маразматичный код), но что-то делать можно.
Да, хэши вроде как и быстры, но они медленнее массива
Рекомендую освежить память, http://perldoc.perl.org/fields.html , что-то почерпнуть можно.
Ну и, алгоритм, его можно улучшать бесконечно.
Смотрите какая операция у вас самая частая - отталкивайтесь от этого.
Если можете обойтись без множественного вызова функции путем дублирования кода - дублируйте код (ой, за это меня казнят smile) ) - но, мы же оптимизируем скорость smile 
PM MAIL ICQ Skype   Вверх
arto
Дата 10.6.2011, 16:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1495
Регистрация: 31.10.2004

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



или использовать xs:

# perl -MBenchmark=timethese -MList::Util=sum -e 'my @a = 0..1023; timethese ($ARGV[0], { XS => sub { return sum @a }, Perl => sub { my $a = 0; $a += $_ foreach (@a); return $a } } )' 1000000
Benchmark: timing 1000000 iterations of Perl, XS...
      Perl: 129 wallclock secs (109.62 usr +  0.00 sys = 109.62 CPU) @ 9122.42/s (n=1000000)
        XS:  7 wallclock secs ( 6.05 usr +  0.00 sys =  6.05 CPU) @ 165289.26/s (n=1000000)
#

ускорение в 18 раз
PM MAIL ICQ   Вверх
MakTpaxep
Дата 14.6.2011, 10:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



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


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

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


 




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


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

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