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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Наиболее эффективный способ обработки строки, последовательный доступ к каждой букве 
:(
    Опции темы
amg
Дата 17.8.2006, 09:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Уважаемые обитатели этого форума!
Имею вопрос.
Как наиболее эффективно (скорость, память) что-то сделать с каждой буквой очень длинной строки? И как отследить потребляемую скриптом память?

Самое быстрое, что мне самому удалось придумать:
Код
#!/usr/bin/perl -w

use Time::HiRes qw( time );

my $str = 'qwertyuiop' x 1e6;
my ($letter, $time0, $time1);

$time0 = time();
my $str1 = reverse $str;
while ($str1) {
  $letter = chop $str1;
  # do something with $letter
}
$time1 = time();
print "while_chop: \t", $time1 - $time0, "\n";


Это сообщение отредактировал(а) amg - 17.8.2006, 09:56
PM MAIL   Вверх
Danissimo
Дата 17.8.2006, 10:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



У меня встречный вопрос: откуда ноги растут? Наверняка же хочется манипулировать буквами не на пустом месте. Чем продиктована такая необходимость?
PM MAIL   Вверх
amg
Дата 18.8.2006, 11:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Второй вопрос (как отследить потребляемую скриптом память) решился. В очередной раз торжествует принцип "На CPAN'е есть всё". Нашелся модуль Memchmark, который делает как раз то что нужно.

Вопрос "Как наиболее эффективно что-то сделать с каждой буквой очень длинной строки?" остается актуальным.
PM MAIL   Вверх
Nab
Дата 18.8.2006, 11:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Я пробовал применить такие конструкции:
Код

foreach (split '', $str) { print $_ } # 4.1
while ($str =~ /(.)/g) { print $1 } # 3.1
$i = 0; while ($i < length $str) {print substr($str, $i++, 1) } # 1.6
for (my $i = 0; $i < length $str; $i++) { print substr($str, $i, 1) } # 1.5

но они практически все медленнее.
Так что while с chop получается самая быстрая конструкция, IMHO. smile 
Возможно быстрее будет подпрограмма на Си прикомпиленая в модуль, но тут я не спец, и не подскажу как... smile
Да и не уверен в этом, perl вcе же заточен для обработки строк наилучшим образом....

Это сообщение отредактировал(а) Nab - 18.8.2006, 12:50


--------------------
 Чтобы правильно задать вопрос нужно знать больше половины ответа...
Perl Community 
FREESCO in Ukraine 
PM MAIL   Вверх
amg
Дата 21.8.2006, 13:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Nab, спасибо. Я пробовал примерно то же самое. Результаты аналогичны. Буду думать в сторону Си.

PM MAIL   Вверх
Nab
Дата 21.8.2006, 23:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



А обязательна последовательная обработка строки, может задачу можно распараллелить?
Мне кажется в этом случае будет прирост производительности ...


--------------------
 Чтобы правильно задать вопрос нужно знать больше половины ответа...
Perl Community 
FREESCO in Ukraine 
PM MAIL   Вверх
amg
Дата 22.8.2006, 11:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Попробовал распараллелить задачу на два процесса (fork). Выигрыша в скорости это не принесло. smile 
PM MAIL   Вверх
sharq
Дата 22.8.2006, 12:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Perl Liker
**


Профиль
Группа: Участник
Сообщений: 841
Регистрация: 13.12.2004
Где: Ростов-на-Дону

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



Цитата(amg @  22.8.2006,  12:36 Найти цитируемый пост)
Попробовал распараллелить задачу на два процесса (fork). Выигрыша в скорости это не принесло. smile  

Правильно, распараллеливание стоит применять только при работе с сетевыми интерфейсами!

Цитата(amg @  17.8.2006,  10:53 Найти цитируемый пост)
И как отследить потребляемую скриптом память?

С помощью утилиты ps


amg, вот так бы я делал:
Код

my $str = 'sdluadlkjfho4i478msdwaedqydhyhjsdkqw';
print "$1\n" while $str =~ /(.)/sg;

А зачем тебе так важна скорость здесь?

 smile

Добавлено @ 12:14 
И скорость работы отдельных кусков perl-кода лучше замерять с помощью Benchmark.




--------------------
[color=gray]There's More Than One Way To Do It[/color]
PM MAIL WWW ICQ Skype   Вверх
amg
Дата 22.8.2006, 16:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Цитата
amg, вот так бы я делал: ...
Этот вариант раза в 3 медленнее

Цитата
А зачем тебе так важна скорость здесь?
Биоинформатика. Биомолекулы (белки, например) представляются в виде последовательности букв. Эти последовательности занимают до десятков мегабайт. Их нужно парсить.

Цитата
И скорость работы отдельных кусков perl-кода лучше замерять с помощью Benchmark.
Benchmark мне показалось неудобно встраивать в большой рабочий скрипт. А результаты по скорости он показывает такие же.

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


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

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


 




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


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

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