Демонизация или скрипт в фоновом режиме

phprus

Moderator
Команда форума
john.brown
Демон лучше вообще писать на С. Написать на С сложнее чем на Perl или PHP, но вот рессурсов сишный демон будет потреблять меньше.

Можно сравнение скорости. а именно на сколько PCRE в perl быстрее чем в php?
 

whirlwind

TDD infected, paranoid
phprus

тесты на апачевском логе в 1 мб

test1.php - 0.0952301025391 sec(s)
PHP:
<?php

$result = Array();
$start = microtime(true);
while(!feof(STDIN)){
	$line = fgets(STDIN);
	if ( preg_match('/referer:\s+(.*\.php)/i',$line,$m) )
		$result[] = $m[1];
}
$exec = microtime(true) - $start;
echo "$exec sec(s)\n";
echo join("\n",$result);

?>
test1.pl - 0.0600860118865967 sec(s)
PHP:
#!/usr/bin/perl -w
use strict;
use Time::HiRes qw/time/;
my @result = ();
my $start = time;
while (<>){
	push(@result,$1) if /referer:\s+(.*\.php)/io
}
my $exec = time - $start;
print "$exec sec(s)\n";
print join("\n",@result);
test2.php - 0.0270338058472 sec(s)
PHP:
<?php

$text = "";
while (!feof(STDIN)) $text .= fread(STDIN,2048);
$start = microtime(true);
preg_match_all('/referer:\s+(.*\.php)/i',$text,$m);
$exec = microtime(true) - $start;
echo "$exec sec(s)\n";
var_dump($m);

?>
test2.pl - 0.020028829574585 sec(s)
PHP:
#!/usr/bin/perl -w
use strict;
use Time::HiRes qw/time/;
my @result = ();
my $text = "";
$text .= $_ while <>;
my $start = time;
push(@result,$1) while $text =~ /referer:\s+(.*\.php)/igo;
my $exec = time - $start;
print "$exec sec(s)\n";
print join("\n",@result);
ЗЫ. чето форум сжирает бекслеши из перловых регулярок
 

phprus

Moderator
Команда форума
whirlwind
Понял. был не прав в отношении скорости. Хотя во втором случае разница не так велика.

ЗЫ. чето форум сжирает бекслеши из перловых регулярок
А если попробовать без подсветки? то тоже бекслеши пропадают?
 

nerezus

Вселенский отказник
phprus
а потенциальные ошибки типа утечек памяти и всевозможных переполнений? Уж лучше на джаве..
 

whirlwind

TDD infected, paranoid
>Хотя во втором случае разница не так велика
правильно. я специально два варианта привел. во втором случае выполняется поиск в одной строке. первый случай демонстрирует то, что PHP компилирует регэксп при каждом вызове или дескрипторы медленные.
 

john.brown

просто кулибин
И синтаксис! Что может быть изяшнее и лаконичнее записи:

while (<> ){ push(@result,$1) if /referer:\s+(.*\.php)/io }

Ну ни как пхп`шный вариант... Так что не чего наезжать на перл, хороший язык... ;)
 

Wicked

Новичок
whirlwind
первый случай демонстрирует то, что PHP компилирует регэксп при каждом вызове
в php есть такой modifier - S
S - When a pattern is going to be used several times, it is worth spending more time analyzing it in order to speed up the time taken for matching. If this modifier is set, then this extra analysis is performed. At present, studying a pattern is useful only for non-anchored patterns that do not have a single fixed starting character.
 
Сверху