colshrapnel / safemysql

A real safe and convenient way to handle MySQL queries.
Apache License 2.0
396 stars 197 forks source link

Lexer #34

Open survived opened 9 years ago

survived commented 9 years ago

Изменён принцип, по которому метод SafeMySQL::prepareQuery находил плейсхолдеры. Ранее он разбивал "сырую" строку на подстроки с помощью регулярных выражений, теперь проходит циклом по всей строке (кроме последнего символа, но это тонкости реализации), что даёт бОльшую производительность, нежели преждний алгоритм. (возможно, я просто помешан на производительности, а на самом деле выигрыш во времени будет не существенен..)

colshrapnel commented 9 years ago

Честно говоря, я решил замерить обе варианта на простом коде, который приведён ниже. И в вашем варианте у меня получилось в два раза дольше - 0,24 сек против 0,122...

$st = microtime(1);
for ($i=1; $i<10000; $i++)
{
    $db->parse("SELECT * FROM table WHERE id=?i AND name=?s AND surname=?s",12324,'John','Doe');
}
echo round(microtime(1)-$st,4);
survived commented 9 years ago

Это было действительно неожиданно. Уж не думал, что столь незамысловатый и простой подход даст настолько меньше производительности, нежели от него ожидалось. Не так много пишу на php, не имел такой практики. Чтож, чтобы повысить производительность, нужно отдать бОльшую часть работы встроенным функциям, которые хорошо оптимизированы разработчиками и реализованы на си, что я и сделал. С последним коммитом код работает чуть быстрее Вашей реализации, но алгоритм может быть менее понятен (но мне, например, всё понятно :D).