Open survived opened 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);
Это было действительно неожиданно. Уж не думал, что столь незамысловатый и простой подход даст настолько меньше производительности, нежели от него ожидалось. Не так много пишу на php, не имел такой практики. Чтож, чтобы повысить производительность, нужно отдать бОльшую часть работы встроенным функциям, которые хорошо оптимизированы разработчиками и реализованы на си, что я и сделал. С последним коммитом код работает чуть быстрее Вашей реализации, но алгоритм может быть менее понятен (но мне, например, всё понятно :D).
Изменён принцип, по которому метод SafeMySQL::prepareQuery находил плейсхолдеры. Ранее он разбивал "сырую" строку на подстроки с помощью регулярных выражений, теперь проходит циклом по всей строке (кроме последнего символа, но это тонкости реализации), что даёт бОльшую производительность, нежели преждний алгоритм. (возможно, я просто помешан на производительности, а на самом деле выигрыш во времени будет не существенен..)