Вы используете устаревший браузер. Этот и другие сайты могут отображаться в нём некорректно. Вам необходимо обновить браузер или попробовать использовать другой.
Недавно задался вопросом, в сурсе столько функций, а какие быстрые, какие медленные?
Написал небольшой плагин и понял, что StrEqual, который, чисто логически, должен быть быстрее strcmp, который вычисляет, насколько строка больше или меньше, медленней своего аналога с большим функционалом
1 и 3 - StrEqual
2 и 4 - strcmp, проверялось плагином, прикрепленным как "lal.sp"
Хотя в большинстве плагинов как раз таки используется StrEqual
Так вот предлагаю прямо здесь составить список функций и их аналогов на замену, включая операторов
где-то слышал, что != быстрее, что кстати логично, но разница есть, что сравнивать (lal2.sp)
каждый раз разные показатели, то быстрее, то нет, решайте уж сами
Я бы уже при несовпадении длин строк выдал, что они не совпадают.
Да и в реализации выше, выйдет так, что если обе строки начинаются одинаково, но у другой есть продолжение, то прилетит true всё равно.
Я бы уже при несовпадении длин строк выдал, что они не совпадают.
Да и в реализации выше, выйдет так, что если обе строки начинаются одинаково, но у другой есть продолжение, то прилетит true всё равно.
Вообще, нуно было сделать последовательное сравнение строк всем способами, потом менять строки и снова их сравнивать
Так были бы понятнее результаты.
Пожалуй сделаю так сейчас
Сообщения автоматически склеены:
Вот, переписал. Теперь всё гораздо нагляднее выглядит:
Увлекся я немного данным вопросом и мне стало интересно, так ли хорош вариант посимвольного сравнения, ведь для его работы SP делает немного больше действий чем, вызов сишной функции.
Для тестов использую SM 1.10:
Какие изменения я внес?
1) Ранее я использовал случайный набор строк, мне казалось что это хороший вариант, но зачастую сравнение строк используется для проверки classname у entity или название оружия с которого было совершено убийство.
→ Выбрал несколько вариантов оружия с префиксом weapon_ и без него:
Первая пара: (строки одинаковой длины, но разные по содержанию)
weapon_mp9
weapon_mp7
Вторая пара: (полностью одинаковые строки)
weapon_mp9
weapon_mp9
Третья пара: (полностью разные строки)
weapon_hegrenade
weapon_awp
Четвертая пара: (строки одинаковой длины, но разные по содержанию)
mp9
mp7
Пятая пара: (полностью одинаковые строки)
mp9
mp9
Шестая пара: (полностью разные строки)
hegrenade
awp
2) Какие еще строки обычно сравниваются плагинами? Верно, команды игрока. Уже давно перестал использовать RegConsoleCmd для создания команды, что позволяет менять список команд "налету", а также поддерживать команды на кириллице.
→ Для сравнения команд обычно используется StrCompare, особенно если команда имеет аргументы. Еще кстати StrCompare во многих Weapon Skins плагинах используется для определения ножей. Все понимают, что адекватная длина команды в приделах 20 символов, более длинные строки использовать просто неудобно.
В данном примере StrContains используется, чтобы отсеять все команды с префиксом sm_ т.к. использовать их в чате нельзя.
C-подобный:
strcopy(cmd, sizeof(cmd), sArgs);
TrimString(cmd);
if (StrContains(cmd, "sm_") == -1)
{
if (g_aCommands.FindString(cmd) != -1)
{
//
}
if (cmd[0] == '/')
return Plugin_Handled;
}
Строки которые я добавил:
Первая пара: (строки одинаковой длины, но разные по содержанию)
1лтшау
!knife
Вторая пара: (полностью одинаковые строки)
!ножи
!ножи
Третья пара: (полностью разные строки)
Вася, привет. Почему давно не заходил на сервер. У нас тут много нового, тебе показать что такое RP в CS:GO?
!ножи
Со строками определились, остается определиться с функциями. Вообще, использовать самописные ф-и не эффективно, т.к. SP это виртуальный язык и любая инструкция плагина передается сначала в VM, обрабатывается и возвращает результат. (Если я ошибаюсь, то поправьте) Но в качестве эксперимента воспользуемся функцией написанной R1KO и мой вариант. Теперь остается выбрать встроенные варианты: StrContains, strcmp. А также стоковую функцию: StrEqual. Функцию strncmp тоже задействуем, будем сравнивать строки, дабы найти weapon_ , такое тоже частенько используется в плагинах для отслеживания урона например. А также вариант его замены: str[0] == 'w' , но такое подойдет только если мы точно знаем, что в строке на w может начинаться только weapon_ , для чистоты эксперимента посимвольное сравнение с weapon_ вынесем в стоковую функцию.
Код тестового плагина с вариантом кастомной функции проверки строк:
UTIL_StrCmpEx2.sp:
public void OnPluginStart()
{
PrintToServer("%i", UTIL_StrCmpEx2("test", "test"));
PrintToServer("%i", UTIL_StrCmpEx2("t", "test"));
PrintToServer("%i", UTIL_StrCmpEx2("test", "t"));
PrintToServer("%i", UTIL_StrCmpEx2("test", "sers"));
}stock bool UTIL_StrCmpEx2(const char[] szString1, const char[] szString2) // Это бред, изначально было лучше, но вылетало
{
static int x; static bool b; x = 0; b = szString1[0] == szString2[0];
while (b && !(szString1[x] == '\0' || szString2[x] == '\0')) { ++x; b = szString1[x] == szString2[x]; } return b;
}