Аналоги функций на более быстрые

inklesspen

Пишу модули под LSD
Меценат
Сообщения
1,687
Реакции
696
Недавно вернулся к этому вопросу и обнаружил: IntToString медленней FormatEx
Ничего не хочу сказать кроме того, что я иду заменять все IntToString в плагинах
sm_inttostring_low_test 1000 1000000
Count - 1000
Value- 1000000
Format - 0.000048
FormatEx - 0.000042
IntToString - 0.000138

sm_inttostring_low_test 1000 100000000
Count - 1000
Value- 100000000
Format - 0.000048
FormatEx - 0.000042
IntToString - 0.000142

sm_inttostring_low_test 1000 3214152132
Count - 1000
Value- -1080815164
Format - 0.000061
FormatEx - 0.000043
IntToString - 0.000149

sm_inttostring_low_test 1000 321415213
Count - 1000
Value- 321415213
Format - 0.000048
FormatEx - 0.000043
IntToString - 0.000137
 

Вложения

  • inttostring_low.sp
    938 байт · Просмотры: 4
Последнее редактирование:

inklesspen

Пишу модули под LSD
Меценат
Сообщения
1,687
Реакции
696
Слишком мало. Нужно больше.
Погрешность, все дела.
Не проблема
sm_inttostring_low_test 100000 100000
Count - 100000
Value- 100000
Format - 0.005547
FormatEx - 0.005321
IntToString - 0.014259

sm_inttostring_low_test 10000 100000
Count - 10000
Value- 100000
Format - 0.000510
FormatEx - 0.000463
IntToString - 0.001398

sm_inttostring_low_test 1000000 100000
Count - 1000000
Value- 100000
Format - 0.059914
FormatEx - 0.055972
IntToString - 0.150521
Сообщения автоматически склеены:

Попробовал на хостинге с Linux сервером, результат лучше, но все-равно хуже, чем FormatEx
Count - 100000
Value- 4213123
Format - 0.005315
FormatEx - 0.004486
IntToString - 0.009262
 
Последнее редактирование:

_wS_

Участник
Сообщения
335
Реакции
676
Тоже потестил сравнение строк, и даже показалось, что неплоха функция:

PHP:
stock bool StrEqual_(const char[] s1, const char[] s2)
{
    static int i;
    i = -1;
    while (++i != -1) {
        if (s1[i] != s2[i]) {
            return false;
        }
        // Есть шанс, что у s1 это конец буфера "AB0", а в s2 сделали s2[2] = 0 ("AB0CD0").
        // Поэтому, если символы совпали, и это символ конца строки, то return true, иначе s1 потеряет сознание в next итерации.
        if (!s1[i]) {
            return true ;
        }
    }
    return true;
}

Но она неплоха только при несовпадениях в начальных индексах.
Если немало первых символов совпадает, то сервер зависнет на несколько лет и начнёт умолять о strcmp.

--
А, кст могу еще сказать, что функции ArrayList::Find.. намного медленнее, чем вариант FormatEx + StringMap::Get..
 

Grey83

Ленивая и невнимательная жопа
Сообщения
4,828
Реакции
2,837
@_wS_, а почему просто не сделать так?
C-подобный:
stock bool StrEqual_(const char[] s1, const char[] s2)
{
    static int i;
    i = -1;
    while(s1[++i]) if(s1[i] != s2[i]) return false;

    return true;
}
 

_wS_

Участник
Сообщения
335
Реакции
676
@_wS_, а почему просто не сделать так?
C-подобный:
stock bool StrEqual_(const char[] s1, const char[] s2)
{
    static int i;
    i = -1;
    while(s1[++i]) if(s1[i] != s2[i]) return false;

    return true;
}
StrEqual_("", "AB") вернёт true

Кстати, если любишь оптимизацию, то по идее ставить скобки {} это хороший тон =)
Я вот писал еще
int i; // Надеясь что тут 0
Но в C++ это же не так верно, более логично будет int i = 0;
А то по привычке можно допустить ошибку, если пишешь на другом языке, где другие правила.
Имена переменных не MyVar, а myVar и тд.
Есть где-то классная статья с советами, как придерживаться стандарта.
 

inklesspen

Пишу модули под LSD
Меценат
Сообщения
1,687
Реакции
696
C-подобный:
stock bool StrEqual_(const char[] s1, const char[] s2)
{
    static int i;
    i = 0;
    for(;s1[i] == s2[i];++i)    if(!s1[i])    return true;
    return false;
}
?
 
  • Мне нравится
Реакции: _wS_

Grey83

Ленивая и невнимательная жопа
Сообщения
4,828
Реакции
2,837
ставить скобки {} это хороший тон
Они необходимы обычно только для функции и когда нужно заключить в них больше одной строки.
Ну ещё иногда у сложных условий или когда в условиях нужно ничего не делать.
StrEqual_("", "AB") вернёт true
Вот так не должно:
C-подобный:
stock bool StrEqual_(const char[] s1, const char[] s2)
{
    static int i;
    i = -1;
    while(s1[++i] || s2[i]) if(s1[i] != s2[i]) return false;

    return true;
}
Сообщения автоматически склеены:

@inklesspen,
C-подобный:
    i = 0;
    for(; s1[i] == s2[i]; ++i)
то же самое что и
C-подобный:
for(i = 0; s1[i] == s2[i]; ++i)
 
Последнее редактирование:
  • Мне нравится
Реакции: _wS_

Kruzya

Raspberry Pi 4
Команда форума
Меценат
Сообщения
10,550
Реакции
8,726
Вот так не должно
Зато лично мне виднеется другая проблема: можно выйти за пределы буфера и начать сравнивать что-то не то.

Вообще, кстати, я когда писал свой компаратор строк, начинал сразу со сравнения длины обеих строк: если она отличается, то и строки разные, и смысла сравнивать каждый индекс нет, можно просто false плюнуть, но не знаю, насколько это медленнее обычного сравнивания строк в лоб. По идее на подсчёт длины оно ж ещё пойдёт время потратит процессорное в поисках нулевого байта, но как оно на деле будет...
 

Grey83

Ленивая и невнимательная жопа
Сообщения
4,828
Реакции
2,837
можно выйти за пределы буфера
мы же про строковые переменные с завершающим нулём говорим?
while(s1[++i] || s2[i]) if(s1[i] != s2[i]) return false;
Как тут может получиться, что мы выйдем за границу?
 

Kruzya

Raspberry Pi 4
Команда форума
Меценат
Сообщения
10,550
Реакции
8,726
Как тут может получиться, что мы выйдем за границу?
Точно не скажу, но у меня такие приколы были с аналогичным кодом на 1.7.2 ещё точно. Просто каким-то образом перескакивал не в тот кусок памяти. Из-за этого вышеупомянутую проверку длины и втыкал.
 

_wS_

Участник
Сообщения
335
Реакции
676
Да, теперь чётко, только вариант Grey83 выглядит более запутанным =)
Уже не стоит пытаться улучшить stock, ибо учёные доказали, что strcmp приедет первым =)
Проверил компил в Visual C++ вариант без скобок {}, работает (хм, помню мне ругалось на что-то такое).
 

Grey83

Ленивая и невнимательная жопа
Сообщения
4,828
Реакции
2,837
выглядит более запутанным
Можно сделать вот так:
C-подобный:
stock bool StrEqual_(const char[] s1, const char[] s2)
{
    static int i;
    i = 0;
    while(s1[i] == s2[i]) if(!s1[i++]) return true;

    return false;
}
В принципе мало что изменится.
 
  • Мне нравится
Реакции: _wS_
Сверху