Написание плагинов
#61

Ржака однако)
Вот самая быстрая от White_116 походу
Reply
#62

Щас пофикшу
Reply
#63

Кстати заметил недочёт, вот например вижу такой код:
PHP Code:
void StringToLowerByTable_ASCII(char *string) {
    
int index = -1;
    while (
string[++index]) {
        
string[index] = chars_lower_ascii[string[index]];
    }
}
static 
cell AMX_NATIVE_CALL TP_StringToLowerByTable_ASCII(AMX *amxcell *params)
{
    
char *string;
    
amx_StrParam(amxparams[1], string);
    if (
string != NULL)
    {
        
StringToLowerByTable_ASCII(string);
    }
    else
    {
        
string "";
    }
    
cell *addr NULL;
    
amx_GetAddr(amxparams[1], &addr);
    
amx_SetString(addrstring00strlen(string));
    return 
1;

Функция StringToLowerByTable_ASCII по сути не нужна, лучше в тело TP_StringToLowerByTable_ASCII закинуть начинку. Лишний вызов функции получается. При замерах это должно сказаться.
Reply
#64

В теории компилятор должен убрать вызов и подставить функцию.
UPD: Проверил, так и есть
Reply
#65

Проверяйте.
Code:
void UpperToLower(char *str)
{
    for (unsigned char ch = *str; ch; str++)
    {
        ch = *str;
        if ((ch >= 'A' && ch <= 'Z') || (ch > 191 /*А*/ && ch < 224 /*Я*/))
            *str += 32;
        else if (ch == 168 /*Ё*/)
            *str = 184;
    }
}
Reply
#66

Quote:
Originally Posted by DartfoL
View Post
В теории компилятор должен убрать вызов и подставить функцию.
UPD: Проверил, так и есть
Подставить функцию, что и будет сделано)
Для маленьких функций лучше использовать inline:
PHP Code:
inline void StringToLowerByTable_ASCII(char *string)
{
    
int index = -1;
    while (
string[++index])
    {
        
string[index] = chars_lower_ascii[string[index]];
    }

Он просто при вызове вставит лишь начинку (а может и нет, зависит от компилятора). Так что в исходнике поправьте это)
Reply
#67

После шаманства моя функция заработала нормально и на скорость это не повлияло
PHP Code:
int UpperToLower_miaso(char *str)
{
    
int len 0;
    
char ch;
    while (
true)
    {
        
ch = *str;
        if (
ch == 0) break;
        if (
ch 'A' && ch 'Z'ch += 32;
        else if (
ch 'А' && ch 'Я'ch += 32;
        else if (
ch == 'Ё'ch 184;
        *
str ch;
        
len++;
        
str++;
    }
    return 
len;

Если вместо букв написать ascii коды - работает только c латиницой, WTF
Reply
#68

Попробуй при старте плагина вставить setlocale(LC_ALL, "");
Reply
#69

Diman777,Не помогло.
Функция StringToLowerByTable_ASCII - по логике должна работать, но почему то не хочет.
Quote:
Originally Posted by NarutoUA
View Post
Проверяйте.
Code:
void UpperToLower(char *str)
{
    for (unsigned char ch = *str; ch; str++)
    {
        ch = *str;
        if ((ch >= 'A' && ch <= 'Z') || (ch > 191 /*А*/ && ch < 224 /*Я*/))
            *str += 32;
        else if (ch == 168 /*Ё*/)
            *str = 184;
    }
}
Проверил и вот что получилось:


Добавлена функция от NarutoUA, внесены изменения от Diman777, фикс моей ф-ии.
Reply
#70

Quote:
Originally Posted by MIASO
View Post
Если вместо букв написать ascii коды - работает только c латиницой, WTF
Потому что ты берёшь и сравниваешь тип char (который от -128 до 127), с числами от 191 до 224. В этом случае проверки никогда не будут истинными. Поэтому необходимо привести указатель к unsigned char (ну или "вписать буквы"). Так что ничего WTF-шного.
Reply
#71

Короче ставлю это на стол
Code:
inline unsigned int UpperToLower_Mutha2(unsigned char *str) { //Mutha_X
	unsigned char *s = str;
	while(*str) {
		if( unsigned(*str - 65) < 26 ) { // en
			*str += 32;
		} else if( unsigned(*str - 192) < 32) { // ru
			*str += 32;
		} else if(*str == 168) { // ru Ё
			*str =  184;
		}
		++str;
	}
	return ((unsigned char *)str - s) + 1;
}
...

я победил... почти...
Нет, просто около 65% времени занимает "прослойка" связанная с дублированиями строки. Надеюсь вы поняли на что намекаю)
через пару минут в это сообщение догружу архив.
Reply
#72

Quote:
Originally Posted by Mutha_X
View Post
Нет, просто около 65% времени занимает "прослойка" связанная с дублированиями строки. Надеюсь вы поняли на что намекаю)
Много времени занимает
PHP Code:
amx_StrParam(amxparams[1], string);
amx_SetString(addrstring00len 1); 
Reply
#73

Я к тому, что стоило бы попробовать как-то получить более прямой доступ к данным из амх-машины, нежели реализованный в этих функциях, тогда и JIT начнёт сдавать свои позиции.
PS именно эти...:
Code:
amx_GetString(...)
amx_SetString(...)
Reply
#74


JIT нервно курит в сторонке. Кто сможет быстрее?
http://pastebin.com/rKqQgaPC
Reply
#75

Quote:
Originally Posted by ZiGGi
View Post
UpperToLower_Mutha_X результат: 200 ms
UpperToLower_Mutha_X2 результат: 226 ms

Тестировал на Linux + Pentium 2020m.
Твой вариант у себя на 7-ке запустил
UpperToLower_Mutha_X результат: 271 ms
UpperToLower_Mutha_X2 результат: 170 ms
Заметно как сказывается влияние системы.
Reply
#76

Quote:
Originally Posted by Mutha_X
View Post
Твой вариант у себя на 7-ке запустил
UpperToLower_Mutha_X результат: 271 ms
UpperToLower_Mutha_X2 результат: 170 ms
Заметно как сказывается влияние системы.
Попробуй в VS включить оптимизацию 3 уровня (-O3 в GCC). Ну или что-то подобное (я не особо в этом разбираюсь).

P.S. А так как сервер, скорее всего, будет работать на Linux, то и тестирование лучше проводить под эту платформу.
Reply
#77

Да, конечно

PHP Code:
static cell AMX_NATIVE_CALL TP_ToLowerString_MuthaX2(AMX *amxcell *params) {
    
cell *str;
    
amx_GetAddr(amxparams[1], &str);
    while(*
str) {
        if( 
unsigned(*str 65) < 26 ) { // en
            
*str += 32;
        } else if( 
unsigned(*str 192) < 32) { // ru
            
*str += 32;
        } else if(*
str == 168) { // ru Ё
            
*str =  184;
        }
        ++
str;
    }
    return 
1;

Забыл дописать: проц Intel Pentium G3258
Reply
#78

Quote:
Originally Posted by ZiGGi
View Post
Попробуй в VS включить оптимизацию 3 уровня (-O3 в GCC). Ну или что-то подобное (я не особо в этом разбираюсь).

P.S. А так как сервер, скорее всего, будет работать на Linux, то и тестирование лучше проводить под эту платформу.
Сам тоже не особо с настройками этого компилятора. В VS2010 есть только /O1, /O2, /Ox (до этого стояла /O2) теперь последняя, соотношение не поменялось, но лишь появилась тенденция к тому, чтобы они по времени местами поменялись (X - ускоряется, Х2 - замедляется).
Поэтому оставляю вопрос для тех, кто шарит.
Reply
#79

Я не понимаю, зачем убрали UpperToLower_Mutha_X, но очевидно, что это будет самый быстрый вариант. Я его немного оптимизировал, вот:
PHP Code:
unsigned char chars_lower_ascii[] = {
    
0x000x010x020x030x040x050x060x070x080x090x0A0x0B0x0C0x0D0x0E0x0F,
    
0x100x110x120x130x140x150x160x170x180x190x1A0x1B0x1C0x1D0x1E0x1F,
    
0x200x210x220x230x240x250x260x270x280x290x2A0x2B0x2C0x2D0x2E0x2F,
    
0x300x310x320x330x340x350x360x370x380x390x3A0x3B0x3C0x3D0x3E0x3F,
    
0x400x610x620x630x640x650x660x670x680x690x6A0x6B0x6C0x6D0x6E0x6F,
    
0x700x710x720x730x740x750x760x770x780x790x7A0x5B0x5C0x5D0x5E0x5F,
    
0x600x610x620x630x640x650x660x670x680x690x6A0x6B0x6C0x6D0x6E0x6F,
    
0x700x710x720x730x740x750x760x770x780x790x7A0x7B0x7C0x7D0x7E0x7F,
    
0x800x810x820x830x840x850x860x870x880x890x8A0x8B0x8C0x8D0x8E0x8F,
    
0x900x910x920x930x940x950x960x970x980x990x9A0x9B0x9C0x9D0x9E0x9F,
    
0xA00xA10xA20xA30xA40xA50xA60xA70xB80xA90xAA0xAB0xAC0xAD0xAE0xAF,
    
0xB00xB10xB20xB30xB40xB50xB60xB70xB80xB90xBA0xBB0xBC0xBD0xBE0xBF,
    
0xE00xE10xE20xE30xE40xE50xE60xE70xE80xE90xEA0xEB0xEC0xED0xEE0xEF,
    
0xF00xF10xF20xF30xF40xF50xF60xF70xF80xF90xFA0xFB0xFC0xFD0xFE0xFF,
    
0xE00xE10xE20xE30xE40xE50xE60xE70xE80xE90xEA0xEB0xEC0xED0xEE0xEF,
    
0xF00xF10xF20xF30xF40xF50xF60xF70xF80xF90xFA0xFB0xFC0xFD0xFE0xFF
};
static 
cell AMX_NATIVE_CALL TP_StringToLowerByTable_ASCII(AMX *amxcell *params)
{
    
cell *pAddress NULL;
    
amx_GetAddr(amxparams[1], &pAddress);
    while (*
pAddress) {
        *
pAddress chars_lower_ascii[*pAddress];
        
pAddress++;
    }
    return 
1;

PHP Code:
UpperToLower_orig     результат974 ms
UpperToLower_miaso     результат
628 ms
UpperToLower_dartfol     результат
422 ms
UpperToLower_Mutha_X     результат
200 ms
UpperToLower_narutoua     результат
658 ms
UpperToLower_Mutha_X2     результат
226 ms
PAWN_UTL_White_116     результат
579 ms
PAWN_UTL_White_116_MACR результат
677 ms
PAWN_ToLowerString     результат
1594 ms
Original String
ЛОЛ Heh мда РОФЛ Ёпта
UpperToLower_orig
лол heh мда рофл ёпта
UpperToLower_miaso
лол heh мда рофл ёпта
UpperToLower_dartfol
лол heh мда рофл ёпта
UpperToLower_Mutha_X
лол heh мда рофл ёпта
UpperToLower_narutoua
лол heh мда рофл ёпта
UpperToLower_Mutha_X2 String
лол heh мда рофл ёпта
UpperToLower_White_116
ЛОЛ heh мда РОФЛ Ёпта
UpperToLower_White_116_MACRO
ЛОЛ heh мда РОФЛ Ёпта
PAWN_ToLowerString String
лол heh мда рофл ёпта 
Тестировал на Linux + Pentium 2020m.
Во вложениях исходники с последними изменениями (и исправленным Makefile), плюс Windows сервер.

P.S. И да, варианты от White_116 не работают под Linux.
Reply
#80

Скомпилировал с clang:
pawn Code:
UpperToLower_orig   результат: 1153 ms
UpperToLower_miaso  результат: 719 ms
UpperToLower_dartfol    результат: 463 ms
UpperToLower_Mutha_X    результат: 182 ms
UpperToLower_narutoua   результат: 676 ms
UpperToLower_Mutha_X2   результат: 393 ms
PAWN_UTL_White_116  результат: 645 ms
PAWN_UTL_White_116_MACR результат: 697 ms
PAWN_ToLowerString  результат: 1599 ms
Тут X2 версия сильно замедлилась.
Reply


Forum Jump:


Users browsing this thread: 14 Guest(s)