parser

Написать ответ на текущее сообщение

 

 
   команды управления поиском

небольшое сравнение трех P

moko 09.07.2009 20:37 / 09.07.2009 21:05

Сравнение производительности Parser, PHP и Python на задаче формирования XML размером ~4,2Mb из таблицы с 10,000 записей.

Такой размер выбран, чтобы процесс работал достаточное для сбора статистики время - от запуска к запуску результаты плавают на 1-2 сотые секунды (поэтому на 6 знаков после запятой можно не обращать внимания).

Для большей наглядности XML формируется 3-мя разными способами. Понятно это не полноценное сравнение, просто одна, но довольно типичная задача.

Parser 3.4.0b:

xml1: cpu 0.103326 memory(16776/3380) parser 3.4.0b VSZ/RSS 28224/20520
xml2: cpu 0.319979 memory(30504/4564) parser 3.4.0b VSZ/RSS 43520/34660
xml3: cpu 0.313312 memory(25472/1404) parser 3.4.0b VSZ/RSS 35200/29492

VSZ/RSS - реальный размер процесса с точки зрения OS

PHP 5.2.6 (такая версия попала под руку):

xml1: cpu 0.176655 memory(4359/248) 5.2.6-1+lenny2
xml2: cpu 0.199986 memory(4359/248) 5.2.6-1+lenny2
xml3: cpu 0.303313 memory(4359/248) 5.2.6-1+lenny2

xml2 без htmlspecialchars: cpu 0.159989 memory(3578/261) 5.2.6-1+lenny2
xml3 без htmlspecialchars: cpu 0.249983 memory(3578/261) 5.2.6-1+lenny2

По поводу памяти php сообщает несколько оптимистичные цифры, с точки зрения OS реальный размер процесса такой: VSZ/RSS 44912/15904

Python 2.5.2 (такой стоит):

xml1: cpu 0.313312
xml2: cpu 0.359976
xml3: cpu 0.389974

xml1 без cgi.escape: cpu 0.166655
xml2 без cgi.escape: cpu 0.20332
xml3 без cgi.escape: cpu 0.233318

Размер процесса в памяти примерно такой: VSZ/RSS 31484/17068
Справочно: после чтения всех данных из SQL cpu ~0.08 sec, против ~0.02 в парсере.

И для сравнения Parser 3.3.0:

xml1: cpu 0.286647 memory(61152/6684) parser 3.3.0
xml2: cpu 1.17659 memory(195072/3836) parser 3.3.0
xml3: cpu 1.28658 memory(234440/5428) parser 3.3.0

Далее чуть измененный тест, так как в 3.3.0 неэффективно сделан возврат большого результата из метода. Если это исключить, ($x[^xml1[^table::sql{select * from test}]]), результаты таковы:

xml1: cpu 0.116659 memory(17936/2220) parser 3.3.0
xml2: cpu 0.483301 memory(67004/832) parser 3.3.0
xml3: cpu 0.549964 memory(90152/2260) parser 3.3.0

Если кратко - существенной разницы в скорости работы между парсером, php и python на указанном тесте нет. Видно, что потребление памяти в процессе работы парсерного кода удалось существенно сократить по сравнению с 3.3.0, но все равно есть куда стремиться. Интересный факт - в php наведение "красоты" путем разбиения на методы оказывается заметно более ресурсоемко, чем в парсере.

Код формирования xml на парсере (сильно короче, чем на остальных языках :):
@xml1[data][field]
^data.menu{<data id="$data.id">
<fdate>$data.fdate</fdate>
<fcontent1>$data.fcontent1</fcontent1>
<fcontent2>$data.fcontent2</fcontent2>
<fcontent3>$data.fcontent3</fcontent3>
<fcontent4>$data.fcontent4</fcontent4>
<fcontent5>$data.fcontent5</fcontent5>
</data>
}

@xml2[data][fields;field]
$fields[^data.columns[]]
^data.menu{<data id="$data.id">
^fields.menu{$field[$fields.column]^if($field ne 'id'){<$field>$data.$field</$field>
}}</data>
}

@xml3[data][fields;field]
$fields[^data.columns[]]
^data.menu{^xml3data[$fields;$data]}

@xml3data[fields;data]
<data id="$data.id">
^fields.menu{^xml3field[$data;$fields.column]}
</data>

@xml3field[data;field]
$result[^if($field ne 'id'){<$field>$data.$field</$field>
}]

@main[]
^connect[mysql://user:password@host/db]{
    ^xml1[^table::sql{select * from test}]
}

$result[cpu $status:rusage.utime memory($status:memory.used/$status:memory.free) parser $env:PARSER_VERSION
]
Реализации на остальных языках плюс функция заполнения таблицы данными доступны в архиве p3test.zip