PDA

Просмотр полной версии : [Вопрос] быстродействие, эффективность или одно и то же.



Роуди.
17.08.2015, 23:03
Всех категорически приветствую Вас, дорогие форумчане pro-pawn.

Сабж: как будет эффективней проверять число строк и столбцов с заданным значением?
Возможно не так изложил свою мысль, но приведу пример.


> Регистрируется игрок
> Диалог с вводом E-MAIL
> Игрок вводит то "мыло", которое уже зарегистрировано
> Выходит ошибка о том, что мыло уже зарегистрировано

У меня есть два варианта:
1. с использованием коллбэка.


CMD:check(playerid, params[])
{
if(sscanf(params, "s[24]", params[0])) return SendClientMessage(playerid, -1, "check nick");

static const
frm_string[] = "SELECT * FROM `users` WHERE `Name` = '%s'";
new query_string[sizeof(frm_string)-2+MAX_PLAYER_NAME];

format(query_string, sizeof(query_string), frm_string,params[0]);
mysql_function_query(mysql_connect_ID, query_string, true, "FindPlayer", "ds", playerid, params[0]);
return true;
}

forward FindPlayer(playerid);
public FindPlayer(playerid)
{
new rows, fields;
cache_get_data(rows, fields);

if(rows)
{
SendClientMessage(playerid, -1, "Аккаунт найден.");
}
else
{
SendClientMessage(playerid, -1, "Аккаунт НЕ найден.");
}
}

}

2. Без использования коллбэка.


CMD:check_two(playerid, params[])
{
if(sscanf(params, "s[24]", params[0])) return SendClientMessage(playerid, -1, "check nick");
static const
frm_string[] = "SELECT * FROM `users` WHERE `Name` = '%s'";

new query_string[sizeof(frm_string)-2+MAX_PLAYER_NAME];

format(query_string, sizeof(query_string),frm_string, params[0]);
new Cache: check = mysql_query(mysql_connect_ID, query_string, true);
if(cache_num_rows()==0)
{
cache_delete(check);
SendClientMessage(playerid, -1, "Аккаунт найден.");
}
else
{
SendClientMessage(playerid, -1, "Аккаунт НЕ найден.");
}

return true;
}

Второй вариант я нашел в модах примерно 13 года, там естественно была старая версия mysql.

Жду Вашего мнения, что лучше(эффективней).

$continue$
18.08.2015, 00:52
1 - по ИДЕИ должно работать быстрей, так как многопоточный плагин.
Стас (Daniel_Cortez) - написал на днях урок как проверить скорость то или иной функции. (http://pro-pawn.ru/showthread.php?12585-%D0%A1%D1%80%D0%B0%D0%B2%D0%BD%D0%B5%D0%BD%D0%B8%D0%B5-%D0%BF%D1%80%D0%BE%D0%B8%D0%B7%D0%B2%D0%BE%D0%B4%D0%B8%D1%82%D0%B5%D0%BB%D1%8C%D0%BD%D0%BE%D1%81%D1%82%D0%B8-%D0%BA%D0%BE%D0%B4%D0%B0-%D0%BD%D0%B0-Pawn-%28%D0%BF%D1%80%D0%BE%D1%84%D0%B8%D0%BB%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%29&p=63412#post63412)
Как Вам, кстати тема: SQL Injection? :spiteful:

Daniel_Cortez
18.08.2015, 06:57
быстродействие, эффективность или одно и тоже
Под эффективностью можно понимать не только производительность кода, но и производительность труда программиста.
Иными словами, эффективным может считаться ещё и вариант, более удобный для использования (и не факт, что код у такого варианта будет самым быстродейственным).
Так что нет, "быстродействие" и "эффективность" - это отнюдь не одно и то же.

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



Второй вариант я нашел в модах примерно 13 года, там естественно была старая версия mysql.
Возьмите RLS в оригинале (2011?), там вообще всё на файлах.



Стас (Daniel_Cortez) - написал на днях урок как проверить скорость то или иной функции. (http://pro-pawn.ru/showthread.php?12585-%D0%A1%D1%80%D0%B0%D0%B2%D0%BD%D0%B5%D0%BD%D0%B8%D0%B5-%D0%BF%D1%80%D0%BE%D0%B8%D0%B7%D0%B2%D0%BE%D0%B4%D0%B8%D1%82%D0%B5%D0%BB%D1%8C%D0%BD%D0%BE%D1%81%D1%82%D0%B8-%D0%BA%D0%BE%D0%B4%D0%B0-%D0%BD%D0%B0-Pawn-%28%D0%BF%D1%80%D0%BE%D1%84%D0%B8%D0%BB%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%29&p=63412#post63412)
Думаете, кому-то интересно знать моё настоящее имя?
И как вы представляете измерение производительности выполнения запросов к БД? В случае с коллбэком профайлер не будет ждать, пока запрос выполнится.

$continue$
18.08.2015, 13:40
1000 запросов в базу под циклом (с многопоточным и однопоточным)

Роуди.
18.08.2015, 14:18
Под эффективностью можно понимать не только производительность кода, но и производительность труда программиста.
Иными словами, эффективным может считаться ещё и вариант, более удобный для использования (и не факт, что код у такого варианта будет самым быстродейственным).
Так что нет, "быстродействие" и "эффективность" - это отнюдь не одно и то же.

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



Возьмите RLS в оригинале (2011?), там вообще всё на файлах.



Думаете, кому-то интересно знать моё настоящее имя?
И как вы представляете измерение производительности выполнения запросов к БД? В случае с коллбэком профайлер не будет ждать, пока запрос выполнится.

Спасибо, мой выбор пал выполнение кода в отдельном потоке. Кстати, насчет имени, ошибаетесь :) Мне интересно было узнать Ваше имя, как говорится Страна должна знать своих Героев.

Тему можно закрывать, вопрос решен.

Daniel_Cortez
18.08.2015, 16:31
1000 запросов в базу под циклом (с многопоточным и однопоточным)
В случае с отдельным потоком будет измерено только время, затраченное на посылку запросов, но не на их выполнение. Да и вообще для выбора лучшего варианта одной теории здесь более чем достаточно.


Тему можно закрывать, вопрос решен.
Перемещаю в архив вопросов, закрыто.