Quote:
Originally Posted by eakwarp
switch - в павне if based, делайте выводы.
|
Да выводы уже были давно сделаны и не только мной, switch работает быстрее if, только вот нужно учитывать то, что проверки по диапазону в switch не может быть. т.е. case 0...9999 по своей сути как макрос, который создаёт case 0:, case 1:, case 2:, case 3:, и в некоторых ситуациях целесообразней использовать if соответственно.
Quote:
Originally Posted by -Stranger-
AirKite, всё-же я настаиваю на том, что playerid в OnDialogResponse подменить можно, используя бота.
Но смысл не в том, как это можно сделать, а в том что это можно сделать, и добиться, как минимум вызова playerid, которого не существует на сервере в данный момент.
По мне лучше перестраховаться, и проверить как на IsPlayerConnected, так и на INVALID_PLAYER_ID.
Данная проверка хуже серверу ну никак не сделает. А вот пользу может принести
|
Даже у бота есть свой ID, и он никак не равен INVALID_PLAYER_ID. Ты конечно прав, что лучше перестраховаться. Однако я себе представлял немного иную архитектуру SAMP. Если playerid было бы возможно подменить, это уже бы давно делали. В любом случае твоя проверка не защитит от мистической подмены playerid, ибо по идее playerid создаётся по факту подключения, а если он есть то и IsPlayerConnected вернёт true... в прочем не будем холиварить, я исходных кодов последних версий samp не видел, как и вы
Quote:
Originally Posted by -Stranger-
На счёт switch > case. Тут больше дело вкуса, но ради интереса сделаю тесты и выложу в эту тему.
|
На самом деле всё зависит сугубо от ситуации. Пример:
pawn Code:
new tick, lol = 5000;
tick = GetTickCount();
for(new i; i < 100000; i++) {
switch(lol) {
case 0..10000: {
// code
}
}
}
printf("SWITCH: %d ms", GetTickCount()-tick);
tick = GetTickCount();
for(new i; i < 100000; i++) {
if(lol >= 0 && lol <= 10000) {
// code
}
}
printf("SWITCH: %d ms", GetTickCount()-tick);
покажет:
Code:
SWITCH: 771 ms
SWITCH: 20 ms
Однако для диапазона в 17, всё же switch будет чуток быстрее.
pawn Code:
new tick, lol = 17;
tick = GetTickCount();
for(new i; i < 100000; i++) {
switch(lol) {
case 0..17: {
// code
}
}
}
printf("SWITCH: %d ms", GetTickCount()-tick);
tick = GetTickCount();
for(new i; i < 100000; i++) {
if(lol >= 0 && lol <= 17) {
// code
}
}
printf("SWITCH: %d ms", GetTickCount()-tick);
Code:
SWITCH: 15 ms
SWITCH: 20 ms
p.s. Вспомнил тему где спрашивалось о том, как сделать case 0..∞: