shoorick: (Default)
[personal profile] shoorick
Отладил скрипт, читающий очень много текста, получил реальные данные и запустил. А попутно решил прикинуть, сколько же там считать. Получилось 8 суток... Придётся распараллеливать.

Date: 2006-04-13 01:49 pm (UTC)
From: [identity profile] artyom.livejournal.com
да уж,
тут главное - чтоб скрипт считал их быстрее, чем они скапливаются =)
From: [identity profile] gour.livejournal.com
а если регекспы скомпилить?

Ну...

Date: 2006-04-13 07:34 pm (UTC)
From: [identity profile] shoorick.livejournal.com
Типа, man perlre, man perlrequick, man perlretut, да?
Читал. Сквозь сон нифига не понял. Завтра утречком попробую...

Re: Ну...

Date: 2006-04-13 10:40 pm (UTC)
From: (Anonymous)
Или код в студию?

Re: Ну...

Date: 2006-04-13 10:40 pm (UTC)
ext_659893: Sapa (Default)
From: [identity profile] sappa.livejournal.com
Или код в студию?

Или

Date: 2006-04-14 03:51 am (UTC)
From: [identity profile] shoorick.livejournal.com
Сейчас, сам попинаю, сравню скорости.
А потом — можно и в студию...

Кстати, не ты ль переводил man perlstyle? Мне недавно лениво было оригинал читать, я русскую версию нагуглил...

Оптимизация

Date: 2006-04-14 04:30 am (UTC)
From: [identity profile] shoorick.livejournal.com
0. Дано: скрипт на тестовом наборе данных (миллион строк) исполняется 22 секунды.

1. Меняем:
s/^\s*(.+?)\s*$/$1/;
на
s/^\s*//;
s/\s*$//;

Время работы - 18 с = 0.818 от исходного

2. Меняем в нескольких местах:
/.../
на
m'...'

Время работы - 17 с = 0.77 от исходного. Хотя возможно, это ускорение объясняется погрешностью замера.

Re: Оптимизация

Date: 2006-04-14 09:59 am (UTC)
ext_659893: Sapa (Default)
From: [identity profile] sappa.livejournal.com
---------------------- bench.pl -----------------------
#!/usr/bin/perl -w
use strict;
use Benchmark;
use String::Util ':all';

timethese -10, {
  'RegSub'      => sub { $_ = " lalalalalala\r\n"; s/^\s*(.+?)\s*$/$1/; },
  'RegTrim'     => sub { $_ = " lalalalalala\r\n"; s/^\s*//; s/\s*$//; },
  'RegExp'      => sub { $_ = " lalalalalala\r\n"; $_ = $1 if /^\s*(.+?)\s*$/;
  'RegExpM'     => sub { $_ = " lalalalalala\r\n"; $_ = $1 if m'^\s*(.+?)\s*$';
  'Trim'        => sub { $_ = " lalalalalala\r\n"; trim($_); },
};
------------------------ EOF -------------------------

# ./bench.pl
Benchmark: running RegExp, RegExpM, RegSub, RegTrim, Trim for at least 10 CPU seconds...
    RegExp: 10 wallclock secs (10.11 usr +  0.01 sys = 10.12 CPU) @ 212490.12/s (n=2150400)
   RegExpM: 11 wallclock secs (10.72 usr +  0.01 sys = 10.73 CPU) @ 204300.56/s (n=2192145)
    RegSub: 10 wallclock secs (10.51 usr +  0.00 sys = 10.51 CPU) @ 113668.51/s (n=1194656)
   RegTrim: 11 wallclock secs (10.62 usr +  0.01 sys = 10.63 CPU) @ 237661.15/s (n=2526338)
      Trim: 11 wallclock secs (10.38 usr +  0.01 sys = 10.39 CPU) @ 258710.30/s (n=2688000)


Вывод: быстрее всего функция trim из String::Util, за ней по скорости идет s/^\s*//; s/\s*$//;, худший вариант - s/^\s*(.+?)\s*$/$1/;. В тестовом примере разница почти в два с половиной раза. Правда все зависит от конкретных данных, длины строк, количества пробелов, и т.п. Но на моем Celeron 2.4GHz, и данной строке скорости выше твоих в 20-40 раз. Речь идет о миллионах строк в секунду, а не одном миллионе за 20 секунд.
Замена /.../ на m'...' никак не сказывается на скорости, что и вполне понятно.

Вот ведь

Date: 2006-04-14 10:45 am (UTC)
From: [identity profile] shoorick.livejournal.com
Надо же... Почти 9 лет пишу на Перле, а всё умудряюсь что-то новое узнать.
Спасибо!

Re: Оптимизация

Date: 2006-04-14 04:48 am (UTC)
From: [identity profile] shoorick.livejournal.com
Поменял
if ($key =~ m'^(SrcAddr|DstAddr|SrcPort|DstPort|FlowTime|Octets)$')
на
if (($key eq 'SrcAddr') || ($key eq 'DstAddr')
|| ($key eq 'SrcPort') || ($key eq 'DstPort')
|| ($key eq 'FlowTime') || ($key eq 'Octets'))


Нифига не выиграл.

Нифига

Date: 2006-04-14 05:17 am (UTC)
From: [identity profile] shoorick.livejournal.com
Попробовал вместо хэша с длинными строками значений использовать хэш массивов.

И снова нифига не выиграл.

Re: Оптимизация

Date: 2006-04-14 10:04 am (UTC)
ext_659893: Sapa (Default)
From: [identity profile] sappa.livejournal.com
А может bottleneck вовсе не здесь? А вообще, длинное сравнение типа
if (($key eq 'SrcAddr') || ($key eq 'DstAddr')
|| ($key eq 'SrcPort') || ($key eq 'DstPort')
|| ($key eq 'FlowTime') || ($key eq 'Octets'))

я бы переписал на:
# Где-то вначале вне циклов
my %ourkeys = map { $_ => 1}
    qw(SrcAddr DstAddr SrcPort DstPort FlowTime Octets);
...
...
if (exists($ourkeys{$key})) {


Впрочем 6 сравнений это немного. Хэш вряд ли даст серьезную прибавку в скорости.

Re: Или

Date: 2006-04-14 08:53 am (UTC)
ext_659893: Sapa (Default)
From: [identity profile] sappa.livejournal.com
> Кстати, не ты ль переводил man perlstyle?
Я.

Кстати о

Date: 2006-04-14 10:49 am (UTC)
From: [identity profile] shoorick.livejournal.com
Несколько дней назад я обнаружил, что Komodo по умолчанию форматирует код (в части отступов, например) не так, как я привык, а в соответствии man perlstyle

Profile

shoorick: (Default)
shoorick

December 2016

S M T W T F S
    1 23
45678910
11121314151617
18 19 2021222324
25262728293031

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Jul. 16th, 2025 12:19 am
Powered by Dreamwidth Studios