Не верь никому или разработка
эффективных приложений
Как писать по настоящему
быстрый код
Почему нужно изучать язык, на
котором пишешь.
sub str_reverse($) {
return join ’’,
reverse split //,
shift;
}
Почему нужно изучать язык, на
котором пишешь.
my $str = "x"x1000;
cmpthese timethese -1
scalar reverse $str
scalar str_reverse $str
Почему нужно изучать язык, на
котором пишешь.
Rate builtin
custom
custom 8727/s -- -
100%
builtin 1854792/s 21154% -
-
Магии нет.
Есть непонимание процессов.
$money = "Your account: 10$n";
#...
print $money;
$$a = 0;
print $money;
Your account: 10$
Your account: 100$
Магии нет.
Есть непонимание процессов.
$money = "Your account: 10$n";
$a = (substr($money,15,0));
print $money;
$$a = 0;
print $money;
Your account: 10$
Your account: 100$
Не верь предрассудкам
• Предварительная оптимизация
• Экономия на спичках
• *** умнее
• *** быстрее
Доверяй, но проверяй.
for (p=buf;p - buf < s; p+=2)
{ *(uint16_t*) p }
или
for (p=(uint16_t*)buf;p-buf < s;
p++)
{ *p }
Код можно менять.
Как делать это с умом.
0. Понимание
1. Тесты
2. Бенчмарки
Код можно менять.
Как делать это с умом.
0. Понимание
1. Тесты
2. Бенчмарки
Код можно менять.
Как делать это с умом.
0. Понимание
1. Тесты
2. Бенчмарки
-Mre=debug
Devel::Cover
Devel::NYTProf
Примеры
/G…([^012]+?)
015?012/sxogc
Примеры
/G…([^012015]+)
015?012/sxogc
Примеры
/G… ([^012015;]+
(;)?[^012015]*)
015?012/sxogc
if ( defined $3 ) …
Twiggy.
my $in;
my $line;
readit: {
if (defined ( $line = <$r> )) {
$in .= $line;
return if $line eq "n";
redo readit;
}
}
Twiggy.
pipe my $r, my $w
or die "$!";
fh_nonblocking $r,1;
cmpthese timethese -1, {
…
}
Twiggy.
sys => sub {
syswrite $w, $buf
or die "$!";
sysread $r, my $in, 4096
or die "$!";
},
Twiggy.
buf => sub {
syswrite $w, $buf
or die "$!";
read $r, my $in, 4096
or die "$!";
},
Twiggy.
buf2 => sub {
syswrite $w, $buf or die "$!";
my $in;my $line;
readit: {
if (defined ( $line = <$r> )) {
$in .= $line;
return if $line eq "n";
redo readit;
}
}
}
Twiggy.
Rate buf2 buf sys
buf2 278368/s -- -60% -70%
buf 696486/s 150% -- -25%
sys 927395/s 233% 33% --
Fun
if(strncmp(
buf, "HTTP/1.1",
8) == 0) ...
Fun
uint32_t * http11 =
(uint32_t *)
"HTTP/1.1";
Fun
union {
char *c;
uint32_t *i;
} p;
Fun
p.c = buf;
if( *p.i ==
*http11 ) ...
Fun
+485.84%!
Fun
+485.84%!
gcc -O0
Fun
+0.71% :(
gcc -O2
Strings. TIMTOWTDI
my $a = "x"x1000;
$a = substr($a,$l);
substr($a,0,$l,'');
Strings. TIMTOWTDI
my $a = "x"x1000;
$a = substr($a,$l);
substr($a,0,$l,'');
Strings. TIMTOWTDI
my $a = "x"x1000;
$a = substr($a,$l);
substr($a,0,$l,'');
(for perl 5.16)
Mons Anderson
<mons@cpan.org>
<v.perepelitsa@corp.mail.ru>

Не верь никому или разработка эффективных приложений (Как писать по настоящему быстрый код). Владимир Перепелица. Moscow.pm 4 апреля