воскресенье, декабря 24, 2006

Что мы теряем на Exception'ах в perl?

Наверняка многие интересовались насколько падает производительность при использовании Exception'ов по сравнению с обработкой ошибок по коду возращаемого значения.

Для начала возьмём к примеру Exception::Class и посмотрим сколько мы теряем используя генерацию исключений. Для этого напишем три функции в одной(Err) будет возвращать в случае ошибки код ошибки(в нашем случае 0), во второй(Exc) будем генерить исключение-родителя, в третьей(childExc) будем генерить исключение-потомка(просто в надежде увидеть какое-то чудо :) ).



#!/usr/bin/perl

use strict;
use warnings;
use Carp qw(croak);
use Benchmark qw(:all);
use Exception::Class( 'TestExceptionBase',
'TestExceptionChild' => { isa => 'TestExceptionBase' } );

sub ProcessDub {
my $dub;
for (my $i=0;$i<100;$i++) j =" $i**2;" dub =" $j;" ret =" (" ret =" (">new() ) if ( !$ret );

return $ret;
}

sub childExc {
my ($i,$delay) = @_;

my $ret;
$ret = ( $i % 2 );
ProcessDub() if ($delay);

croak( TestExceptionChild->new() ) if ( !$ret );

return $ret;
}

my $ok_value = 1;
my $err_value = 2;
my $delay;

print "Run with no delay (with error): \n\n";
$delay = 0;

cmpthese(
-2,
{ 'throw' => sub {
eval { Exc( $err_value, $delay); };
},
'errorCode' => sub {
Err( $err_value, $delay );
},
'throwChild' => sub {
eval { childExc( $err_value, $delay ); };
}
}
);

print "\n\n";
print "Run with no delay (without error): \n\n";

cmpthese(
-2,
{ 'throw' => sub {
eval { Exc( $ok_value, $delay ); };
},
'errorCode' => sub {
Err( $ok_value, $delay );
},
'throwChild' => sub {
eval { childExc( $ok_value, $delay ); };
}
}
);

print "\n\n";
print "Run with delay (with error): \n\n";
$delay = 1;

cmpthese(
-2,
{ 'throw' => sub {
eval { Exc( $err_value, $delay); };
},
'errorCode' => sub {
Err( $err_value, $delay );
},
'throwChild' => sub {
eval { childExc( $err_value, $delay ); };
}
}
);

print "\n\n";
print "Run with delay (without error): \n\n";

cmpthese(
-2,
{
'throw' => sub {
eval { Exc( $ok_value, $delay ); };
},
'errorCode' => sub {
Err( $ok_value, $delay );
},
'throwChild' => sub {
eval { childExc( $ok_value, $delay ); };
}
}
);


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



Run with no delay (with error):

Rate throw throwChild errorCode
throw 821/s -- -6% -100%
throwChild 877/s 7% -- -100%
errorCode 628563/s 76506% 71541% --


Run with no delay (without error):

Rate throw throwChild errorCode
throw 438881/s -- -8% -24%
throwChild 475773/s 8% -- -18%
errorCode 579964/s 32% 22% --


Run with delay (with error):

Rate throw throwChild errorCode
throw 806/s -- -1% -93%
throwChild 813/s 1% -- -93%
errorCode 11817/s 1365% 1353% --


Run with delay (without error):

Rate errorCode throw throwChild
errorCode 11727/s -- -2% -3%
throw 11981/s 2% -- -1%
throwChild 12042/s 3% 1% --


Результаты с "пустой"(with no delay) функцией делались для оценки теоретических потерь - на практике у вас будут функции с телом. Итак в самом худшем случае который в реальном мире не встречается нам грозит просто запредельная потеря скорости(примерно в 700 раз) при генерации исключения, и замедление всего на 20-30% если ошибки не произошло.


Также проводились измерения для функции имеющей хоть какое-то отношение к реальному миру. В качестве заглушки там используется возведение чисел с 0 по 99 в квадрат. Для этой функции замедление при ошибке примерно в 10 раз, и всего на 2-3% если ошибки не произошло.


Вывод. Если у вас не какой-то узкоспециализированный случай, когда много функций/методов в которых почти нет тела как такового, и когда вы используете исключения с умом (я считаю, что в программе что-то непродуманно, если генерация исключений в штатном режиме превышает определённый порог), то можно не терзаться мыслью о потере скорости из-за исключений, а наоборот наслаждаться всеми плюсами их использования.


среда, декабря 20, 2006

Борьба гигантов с поисковым спамом

Что-то в последнее время всё про спам, да про спам получается писать, хотя есть ещё о чём написать. Ну да ладно, добъём тему.


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

Оружие у них должно работать так:
1). Поиск форумов и гестбуков ссылающихся на изначально известные спам-ресурсы, на этих форумах происходит извлечение внешних урл и занесение их в список потенциальных спамресурсов и так до тех пор пока после ряда очередных итераций список спамресурсов не перестанет заметно расти;
2). Далее чтобы отсеять ложные срабатывания запускается ихний Strider URL Tracer , который открывает для каждого url из полученного списка реальный браузер и отслеживает все URL к которым было обращение в результате. В результате создаётся список таких(к которым происходит обращение из url найденных в пункте 1) URL отранжированных по количеству доноров трафика. Если на сайт ссылаются в основном подозрительные сайты и его нет в белом списке (где надо полагать всякие adsens'ы и счётчики), то ему ставится клеймо "Спамер" а всем его донорам выдаётся клеймо "Дорвей".

Дальше товарищи из майкрософт говорят, что для борьбы со спамерами надо использовать их слабости:
1). Заспамленные форумы используются для ловли новых проспамливаемых дорвеев.
2). Чем больше дорвеев для сайта создаст спамер, тем проще его вычислить(см. выше).

В принципе для меня самым интересным здесь является признание факта проверки подозрительных url на реальном браузере. Если это не пустые слова, то достижение победы над seoспамерами - дело техники.

P.S. Там в ссылках по теме к этой статье есть ещё пара интересных заметок. Хотя в целом конечно Пиарщики майкрософта явно поработали против заклятого друга Гугла, но слава богу это не сильно мозолит глаза.

среда, декабря 06, 2006

Опять о captcha

Я недавно писал что стандартные captch'и в виде ввода набора символов уже отжили своё. И тут наткнулся на опровергающий пример. По-крайней мере сходу не могу придумать как такую картинку можно распознать автоматически за более-менее приемлемое время.

Итак сам пример: http://www.ocr-research.org.ua/teabag/2.X.html, http://www.ocr-research.org.ua/teabag/1.X.html.

Очень неплохо на мой взгляд. На том же сайте есть раздел с примерами слабых captcha, с краткой характеристикой: http://www.ocr-research.org.ua/list.html . Кстати список наводит на мысль о русскоязычности владельцев сайта. Они и мтс и км там помянули и еще много русских/украинских сайтов.