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

при старте
А вообще лучше делать методом, который описал Bombo. Прибавлять 0x20
Reply
#42

Накодил тут пример реализации метода описанного Bombo:
Code:
char* UpperToLower(char* str)
{
	int len = strlen(str);
	char ch;
	char* rezult = new char[len];
	for (int i = 0; i <= len; i++)
	{
		ch = *str;
		if ((ch>='A') && (ch<='Z')) ch += 32;
		rezult[i] = ch;
		str++;
	}
	return rezult;
}
Reply
#43

Не очень хороший пример. Функция возвращает указатель на новосозданную строку, которую надо не забыть потом подчистить. Лучше изменять уже существующую строку:
Code:
void UpperToLower(char *str)
{
	unsigned char *s = (unsigned char*)str;
	size_t len = strlen(str);
	for(size_t i = 0; i < len; i++)
	{
		if(s[i] > 64 && s[i] < 91) // буквы A-Z
			s[i] += 32;
		else if(s[i] > 191 && s[i] < 224) // буквы А-Я
			s[i] += 32;
		else if(s[i] == 168) // буква Ё
			s[i] = 184;
	}
}
Reply
#44

Добавил сборку для тестов (см. 1-ый пост в конце). Включает в себя: мод .pwn/.amx, плагин .dll/.so и рядом его исходники.
Функцию для перевода регистра оставил со switch, кому надо - могут сделать в исходниках по своему.

Плагин:
В нём ничего особенного, чисто для тестов можно использовать.
Есть 3 функции:
PHP Code:
native TP_ToLowerString(string[]);
native bool:TP_IsFindIpString(string[]);
native bool:TP_IsNumberString(string[]); 
В исходниках также есть эти 3 функции только уже на Pawn:
PHP Code:
PAWN_ToLowerString(string[]);
bool:PAWN_IsFindIpString(string[]); // автор MX_Master
bool:PAWN_IsNumberString(string[]); 
Reply
#45

Запилил нормальный тестовый мод без мусора:
Code:
#include <a_samp>
#include <jit>
#include <tp>

#define TEXT "Юc№,Q)CxТФLrнПкХBjф[oiCЧм<bhшЗ,ыWR]ЁxчM}*Д8аCbР+bэjЭ1№D=оnнM!чepWo%GTKЧyR6VTЙSАщэЭSem юjFOЩ]ЭьтЛНЖ.ЧHLЛ"

main(){}

public OnGameModeInit()
{
	new time = GetTickCount();
    for (new i; i < 1000000; i++)
	{
		TP_ToLowerString(TEXT);
	}
    printf("PLUGIN: %d ms", GetTickCount() - time);
    
    time = GetTickCount();
    for (new i; i < 1000000; i++)
    {
        UpperToLower(TEXT);
    }
    printf("PAWN UpperToLower: %d ms", GetTickCount() - time);

    time = GetTickCount();
    for (new i; i < 1000000; i++)
    {
        StringToLowerByTable_ASCII(TEXT);
    }
    printf("PAWN StringToLowerByTable_ASCII: %d ms", GetTickCount() - time);
	return 1;
}

new chars_lower_ascii[] = // en+ru
{
	0x00010203,0x04050607,0x08090A0B,0x0C0D0E0F,0x10111213,0x14151617,0x18191A1B,0x1C1D1E1F,
	0x20212223,0x24252627,0x28292A2B,0x2C2D2E2F,0x30313233,0x34353637,0x38393A3B,0x3C3D3E3F,
	0x40616263,0x64656667,0x68696A6B,0x6C6D6E6F,0x70717273,0x74757677,0x78797A5B,0x5C5D5E5F,
	0x60616263,0x64656667,0x68696A6B,0x6C6D6E6F,0x70717273,0x74757677,0x78797A7B,0x7C7D7E7F,
	0x80818283,0x84858687,0x88898A8B,0x8C8D8E8F,0x90919293,0x94959697,0x98999A9B,0x9C9D9E9F,
	0xA0A1A2A3,0xA4A5A6A7,0xB8A9AAAB,0xACADAEAF,0xB0B1B2B3,0xB4B5B6B7,0xB8B9BABB,0xBCBDBEBF,
	0xE0E1E2E3,0xE4E5E6E7,0xE8E9EAEB,0xECEDEEEF,0xF0F1F2F3,0xF4F5F6F7,0xF8F9FAFB,0xFCFDFEFF,
	0xE0E1E2E3,0xE4E5E6E7,0xE8E9EAEB,0xECEDEEEF,0xF0F1F2F3,0xF4F5F6F7,0xF8F9FAFB,0xFCFDFEFF
};
stock StringToLowerByTable_ASCII(string[]) {
	new index = -1;
	while(string[++index]) {
			string[index] = chars_lower_ascii{string[index]};

	}
}

UpperToLower(string[])
{
    new len = strlen(string);
    for (new i; i < len; i++)
    {
        switch (string[i])
        {
            case 'A': string[i] = 'a';
            case 'B': string[i] = 'b';
            case 'C': string[i] = 'c';
            case 'D': string[i] = 'd';
            case 'E': string[i] = 'e';
            case 'F': string[i] = 'f';
            case 'G': string[i] = 'g';
            case 'H': string[i] = 'h';
            case 'I': string[i] = 'i';
            case 'J': string[i] = 'j';
            case 'K': string[i] = 'k';
            case 'L': string[i] = 'l';
            case 'M': string[i] = 'm';
            case 'N': string[i] = 'n';
            case 'O': string[i] = 'o';
            case 'P': string[i] = 'p';
            case 'Q': string[i] = 'q';
            case 'R': string[i] = 'r';
            case 'S': string[i] = 's';
            case 'T': string[i] = 't';
            case 'U': string[i] = 'u';
            case 'V': string[i] = 'v';
            case 'W': string[i] = 'w';
            case 'X': string[i] = 'x';
            case 'Y': string[i] = 'y';
            case 'Z': string[i] = 'z';
            case 'А': string[i] = 'а';
            case 'Б': string[i] = 'б';
            case 'В': string[i] = 'в';
            case 'Г': string[i] = 'г';
            case 'Д': string[i] = 'д';
            case 'Е': string[i] = 'е';
            case 'Ё': string[i] = 'ё';
            case 'Ж': string[i] = 'ж';
            case 'З': string[i] = 'з';
            case 'И': string[i] = 'и';
            case 'Й': string[i] = 'й';
            case 'К': string[i] = 'к';
            case 'Л': string[i] = 'л';
            case 'М': string[i] = 'м';
            case 'Н': string[i] = 'н';
            case 'О': string[i] = 'о';
            case 'П': string[i] = 'п';
            case 'Р': string[i] = 'р';
            case 'С': string[i] = 'с';
            case 'Т': string[i] = 'т';
            case 'У': string[i] = 'у';
            case 'Ф': string[i] = 'ф';
            case 'Х': string[i] = 'х';
            case 'Ц': string[i] = 'ц';
            case 'Ч': string[i] = 'ч';
            case 'Ш': string[i] = 'ш';
            case 'Щ': string[i] = 'щ';
            case 'Ъ': string[i] = 'ъ';
            case 'Ы': string[i] = 'ы';
            case 'Ь': string[i] = 'ь';
            case 'Э': string[i] = 'э';
            case 'Ю': string[i] = 'ю';
            case 'Я': string[i] = 'я';
        }
    }
}
Обращаю внимание на то что в сборке от автора не подключён jit плагин!

Система: Core i7-3630QM 2.4GHz, 16Gb
Результаты:
Code:
PLUGIN: 713 ms
PAWN UpperToLower: 1560 ms
PAWN StringToLowerByTable_ASCII: 478 ms
Во вложении уже исправленная сборка.
Reply
#46

Потестил у себя только плагин и вот что получилось:
Плагин от автора - без jit 1017 ms, с jit 960 ms
Ф-я TP_ToLowerString с моим примером - без jit 996 ms, с jit 927 ms
С примером от DartfoL - без jit 1121 ms, c jit 1067 ms

UPD: Обнаружил, что мой пример пожирает память, т.е. не освобождает уже использованные строки.

Система: AMD Athlon x64 6000+ 3.0 Ghz, 4Gb
Прилагаю измененный main.cpp плагина
Reply
#47

Какие-то странные замеры получились. У меня:
Без JIT:
PAWN UpperToLower: 6055 ms
UpperToLower_orig: 796 ms
UpperToLower_miaso: 599 ms
UpperToLower_dartfol: 598 ms

С JIT:
PAWN UpperToLower: 860 ms
UpperToLower_orig: 780 ms
UpperToLower_miaso: 586 ms
UpperToLower_dartfol: 585 ms

Проц: Intel Core i7-4702MQ, 3.1ГГц
main.cpp http://pastebin.com/PkvDuKJ2
Reply
#48

Ну что вы ещё п*ськами меряетесь...
JIT тащит!


P.S.
Processor: Intel Core I5 2500k @3.4GHz x4; Intel® Hyper-Threading Technology - No
RAM: DDR3 1333MHz 2GBx2 9-9-9-27
OS: Windows 7 64bit
Reply
#49

В плагине есть ещё 2 функции, помимо перевода регистра. Добавил для того, чтобы не было скучно, а то 1 функция на весь плагин - это скука.
Reply
#50

Quote:
Originally Posted by Diman777
View Post
В плагине есть ещё 2 функции, помимо перевода регистра. Добавил для того, чтобы не было скучно, а то 1 функция на весь плагин - это скука.
Нет смысла на маленьких функциях замеры делать, павн быстрее будет из отсутствия конвертации данных amx->c++->amx. Если работать с чистыми плюсами - желательно избавится от АМХ, хаки, хуки, структуры данных и т.д.... Чтобы работать на прямую с функциями сервера и серверными данными.
Reply
#51

White_116, а красный цвет в консоли - это фотошоп или плагин?)
Reply
#52

Quote:
Originally Posted by OKStyle
View Post
White_116, а красный цвет в консоли - это фотошоп или плагин?)
paint.net
Reply
#53

В версии теста 0.0.4 от White_116 есть недочет: массив TEXT_LONG2 перезаписывается после первого вызова функции UpperToLower_orig и во все последующие вызовы этой и других функций уже попадает массив символами только в нижнем регистре.
Поправил, а заодно переписал и свою функцию UpperToLower_miaso

Тест с jit


без jit


UPD: Не заметил, что кто то добавил в мою ф-ю delete[]string исправив тем самым косяк с утечкой памяти, убрал посколько ф-я была переписана.

Проц: AMD Athlon 64 x2 6000+ 3Ghz
Reply
#54

Указывали бы ещё процессор при тестах, интересно какая архитектура быстрей.
Reply
#55

Тест на моем ПК:

Тест с jit:


Без jit:


Процессор: AMD FX-8300
OS: Windpws 7 64bit
Reply
#56

Quote:
Originally Posted by MIASO
View Post
В версии теста 0.0.4 от White_116 есть недочет: массив TEXT_LONG2 перезаписывается после первого вызова функции UpperToLower_orig и во все последующие вызовы этой и других функций уже попадает массив символами только в нижнем регистре.
Это не недочёт, это функция для разового применения и работает с текущим массивом. По факту она выполнит операции равной длине массива и скорость у неё линейна.
Reply
#57

Quote:
Originally Posted by White_116
View Post
Это не недочёт, это функция для разового применения и работает с текущим массивом. По факту она выполнит операции равной длине массива и скорость у неё линейна.
На счет линейной скорости не согласен. На обработку if..else или выборку из таблицы требуются такты процессора, а когда миллион повторений - это ощутимо занимает дополнительное время. Думаю каждый вызов ф-й с исходной строкой будет честнее.
Reply
#58

Не сильно, поменяло результат.

Processor: Intel Core I5 2500k @3.4GHz x4; Intel® Hyper-Threading Technology - No
RAM: DDR3 1333MHz 2GBx2 9-9-9-27
OS: Windows 7 64bit
Reply
#59

PHP Code:
UpperToLower_orig результат1034 ms
UpperToLower_miaso     результат
882 ms
UpperToLower_dartfol     результат
971 ms
UpperToLower_Mutha_X результат
1372 ms
PAWN_UTL_White_116     результат
524 ms
PAWN_UTL_White_116_MACR результат
735 ms
PAWN_ToLowerString     результат
1628 ms 
system:
Intel CPU B980 @2.40GHz x2
8.0 GB ОЗУ
Win 8.1 x64
Reply
#60

Хорошо, а теперь давайте проверим работоспособность функций!

Итого имеем, что функция Mutha_X не работает вообще, а функция MIASO не работает с русскими символами. Получается, что на плюсах работает только оригинальная функция и моя. И в чём прикол замерять скорости в таком случае?
код http://pastebin.com/CjMn000n

Quote:

UPD: Не заметил, что кто то добавил в мою ф-ю delete[]string исправив тем самым косяк с утечкой памяти, убрал посколько ф-я была переписана.

Это был я
Reply


Forum Jump:


Users browsing this thread: 15 Guest(s)