13.02.2017, 01:51
(
Last edited by Diman777; 20/02/2017 at 02:51 PM.
Reason: почищена сборка; инфа о процессоре
)
Многие пишут, что через плагин всё быстрее работает (с условием если грамотно и со смыслом их писать).
Решил попробывать написать свой 1-ый плагин, в котором пока что есть 1 функция UpperToLower, она переводит строку в нижний регистр.
Результат тестирования скорости поражает.
код C++:
код Pawn:
код для теста:
Результат тестирования UpperToLower:
без jit:
C++ | короткая строка = 172, длинная строка = 1047
Pawn | короткая строка = 1978, длинная строка = 8934
с jit:
C++ | короткая строка = 162, длинная строка = 1028
Pawn | короткая строка = 264, длинная строка = 1672
строки, которые использовались при тесте:
Процессор, на котором происходило тестирование: Intel Core i3 530 @ 2.93GHz
Скачать сборку для тестов v0.0.3 (мод + исходники)
Почему через плагин функции работают быстрее? Каковы преимущества?
Решил попробывать написать свой 1-ый плагин, в котором пока что есть 1 функция UpperToLower, она переводит строку в нижний регистр.
Результат тестирования скорости поражает.
код C++:
PHP Code:
// native UpperToLower(string[]);
static cell AMX_NATIVE_CALL UpperToLower(AMX *amx, cell *params)
{
char *string;
int len = 0;
amx_StrParam(amx, params[1], string);
if (string != NULL)
{
len = strlen(string);
for (int i = 0; i < len; i++)
{
switch (string[i])
{
case 'A': string[i] = 'a'; break;
case 'B': string[i] = 'b'; break;
case 'C': string[i] = 'c'; break;
case 'D': string[i] = 'd'; break;
case 'E': string[i] = 'e'; break;
case 'F': string[i] = 'f'; break;
case 'G': string[i] = 'g'; break;
case 'H': string[i] = 'h'; break;
case 'I': string[i] = 'i'; break;
case 'J': string[i] = 'j'; break;
case 'K': string[i] = 'k'; break;
case 'L': string[i] = 'l'; break;
case 'M': string[i] = 'm'; break;
case 'N': string[i] = 'n'; break;
case 'O': string[i] = 'o'; break;
case 'P': string[i] = 'p'; break;
case 'Q': string[i] = 'q'; break;
case 'R': string[i] = 'r'; break;
case 'S': string[i] = 's'; break;
case 'T': string[i] = 't'; break;
case 'U': string[i] = 'u'; break;
case 'V': string[i] = 'v'; break;
case 'W': string[i] = 'w'; break;
case 'X': string[i] = 'x'; break;
case 'Y': string[i] = 'y'; break;
case 'Z': string[i] = 'z'; break;
case 'А': string[i] = 'а'; break;
case 'Б': string[i] = 'б'; break;
case 'В': string[i] = 'в'; break;
case 'Г': string[i] = 'г'; break;
case 'Д': string[i] = 'д'; break;
case 'Е': string[i] = 'е'; break;
case 'Ё': string[i] = 'ё'; break;
case 'Ж': string[i] = 'ж'; break;
case 'З': string[i] = 'з'; break;
case 'И': string[i] = 'и'; break;
case 'Й': string[i] = 'й'; break;
case 'К': string[i] = 'к'; break;
case 'Л': string[i] = 'л'; break;
case 'М': string[i] = 'м'; break;
case 'Н': string[i] = 'н'; break;
case 'О': string[i] = 'о'; break;
case 'П': string[i] = 'п'; break;
case 'Р': string[i] = 'р'; break;
case 'С': string[i] = 'с'; break;
case 'Т': string[i] = 'т'; break;
case 'У': string[i] = 'у'; break;
case 'Ф': string[i] = 'ф'; break;
case 'Х': string[i] = 'х'; break;
case 'Ц': string[i] = 'ц'; break;
case 'Ч': string[i] = 'ч'; break;
case 'Ш': string[i] = 'ш'; break;
case 'Щ': string[i] = 'щ'; break;
case 'Ъ': string[i] = 'ъ'; break;
case 'Ы': string[i] = 'ы'; break;
case 'Ь': string[i] = 'ь'; break;
case 'Э': string[i] = 'э'; break;
case 'Ю': string[i] = 'ю'; break;
case 'Я': string[i] = 'я'; break;
}
}
string[len] = '\0';
}
else
{
string = "";
}
cell *addr = NULL;
amx_GetAddr(amx, params[1], &addr);
amx_SetString(addr, string, 0, 0, len+1);
return 1;
}
PHP Code:
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] = 'я';
}
}
}
PHP Code:
public OnGameModeInit()
{
new time = GetTickCount();
for (new i; i < 1000000; i++)
{
UpperToLower("текст");
}
printf("результат: %d ms", GetTickCount() - time);
return 1;
}
без jit:
C++ | короткая строка = 172, длинная строка = 1047
Pawn | короткая строка = 1978, длинная строка = 8934
с jit:
C++ | короткая строка = 162, длинная строка = 1028
Pawn | короткая строка = 264, длинная строка = 1672
строки, которые использовались при тесте:
pawn Code:
20 символов - иЛBё[еЬMDХ+T9wX/p1%Жs
100 символов - Ю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Л
Скачать сборку для тестов v0.0.3 (мод + исходники)
Почему через плагин функции работают быстрее? Каковы преимущества?