Как лучше?
#1

Как лучше работать с большими массивами состоящими из большого кол-ва небольших текстов?
PHP код:
    new BigStr[2000];
    for(new 
iMAX_PLAYERSi++){
        
format(BigStr,sizeof(BigStr),"%s\t%s",BigStr,PlayerName[i]);
    } 
or
PHP код:
    new BigStr[2000],
        
MiniStr[112];
    for(new 
iMAX_PLAYERSi++){
        
format(MiniStr,sizeof(MiniStr),"\t%s",PlayerName[i]);
        
strcat(BigStr,MiniStr);
    } 
Код приведен только в качестве примера.
На работоспособность и рациональность использования памяти обращать внимания ненадо.
Reply
#2

По мне второй вариант лучше, по крайней мере тем что код читабельный и внятный.
Reply
#3

Замеряйте скорость и сделайте выводы. Лично я всегда делаю первым способом.
Reply
#4

В данном случае быстрее было бы:
pawn Код:
new BigStr[2048];
for(new i; i < MAX_PLAYERS; i++)
{
 strcat(BigStr,"\t");
 strcat(BigStr,PlayerName[i]);
}
Замечу, быстрее, не всегда значит лучше.
Reply
#5

Quote:
Originally Posted by eakwarp
Посмотреть сообщение
В данном случае быстрее было бы:
pawn Код:
new BigStr[2048];
for(new i; i < MAX_PLAYERS; i++)
{
 strcat(BigStr,"\t");
 strcat(BigStr,PlayerName[i]);
}
Замечу, быстрее, не всегда значит лучше.
Как бы это странно не было, но этот способ медленнее, чем format+strcat. Скорость работы strcat значительно понижается, когда длина строки становится большой, потому что каждый раз этой функции приходится получать длину строки-назначения. Это проблема всех Си-подобных языков.

Существует strins, но у меня сервер вылетает при его использовании в цикле, поэтому я использовал memcpy.
Вот код теста:
PHP код:
const ITER_COUNT 100;
new 
BigStr[2000], MiniStr[112], posi;
new 
tick;
tick GetTickCount();
for (new 
0ITER_COUNTj++) {
    for(
0MAX_PLAYERSi++){ 
        
format(BigStr,sizeof(BigStr),"%s\t%s",BigStr,PlayerName[i]);
    }
}
printf("format: %d"GetTickCount() - tick);
tick GetTickCount();
for (new 
0ITER_COUNTj++) {
    for(
0MAX_PLAYERSi++){ 
        
format(MiniStr,sizeof(MiniStr),"\t%s",PlayerName[i]);
        
strcat(BigStr,MiniStr);
    }
}
printf("format+strcat: %d"GetTickCount() - tick);
tick GetTickCount();
for (new 
0ITER_COUNTj++) {
    for(
0MAX_PLAYERSi++){
        
strcat(BigStr"\t");
        
strcat(BigStrPlayerName[i]);
    }
}
printf("strcat: %d"GetTickCount() - tick);
tick GetTickCount();
for (new 
0ITER_COUNTj++) {
    
pos 0;
    for(
0MAX_PLAYERSi++){
        
memcpy(BigStr"\t"pos 4MAX_PLAYER_NAME 4sizeof(BigStr));
        
pos += 1;
        
memcpy(BigStrPlayerName[i], pos 4MAX_PLAYER_NAME 4sizeof(BigStr));
        
pos += strlen(PlayerName[i]);
    }
}
printf("memcpy: %d"GetTickCount() - tick);
/*
tick = GetTickCount();
for (new j = 0; j < ITER_COUNT; j++) {
    pos = 0;
    for(i = 0; i < MAX_PLAYERS; i++){
        strins(BigStr, "\t", pos);
        pos += 1;
        strins(BigStr, PlayerName[i], pos);
        pos += strlen(PlayerName[i]);
    }
}
printf("strins: %d", GetTickCount() - tick);*/ 
Результаты:
PHP код:
format640
format
+strcat146
strcat
211
memcpy
69 
PHP код:
format608
format
+strcat147
strcat
212
memcpy
69 
Reply
#6

Вот функция, которая работает с такой же скоростью, что и memcpy, но значительно удобнее:
PHP код:
stock _strcat(dest[], const src[], &possize sizeof(dest))
{
    new
        
pos,
        
j;
    while (
size && src[j] != '\0') {
        
dest[i++] = src[j++];
    }
    
pos += j;

Тест:
PHP код:
tick GetTickCount();
for (new 
0ITER_COUNTj++) {
    
pos 0;
    for(
0MAX_PLAYERSi++){
        
_strcat(BigStr"\t"pos);
        
_strcat(BigStrPlayerName[i], pos);
    }
}
printf("_strcat: %d"GetTickCount() - tick); 
Результат:
PHP код:
format612
format
+strcat148
strcat
213
memcpy
76
_strcat
76 
Reply
#7

Мб не так понял чтото?)
PHP код:
    new TickCount GetTickCount();
    for(new 
p500p++){
        
minidialog ="";
        
strcat(minidialog"{------}\t\t----| ----------- ----: |----\n");
        
strcat(minidialog"----------- ------- ------- ---- - ----\n");
        
strcat(minidialog"\t----- --- --------- -----\n");
        
strcat(minidialog"\t\t------ ------ \"{------}Alt / 2{------}\"\n");
        
strcat(minidialog"\t\t------ ------ \"{------}Y{------}\"\n");
        
strcat(minidialog"\t\t----| -------------: |----\n");
        
strcat(minidialog"\"{------}/ (3-10){------}\"\t\t------\n");
        
strcat(minidialog"\"{------}/f{------}\"\t\t\t----------- ---- [--------]\n");
        
strcat(minidialog"\"{------}/ (1-2){------}\"\t\t-------- -- ---- ------\n");
        
strcat(minidialog"\"{------}/ (1-16){------}\"\t\t-------- -- ----- ------\n");
        
strcat(minidialog"\"{------}/ (0-99){------}\"\t\t------- ----------- ---\n");
        
strcat(minidialog"\"{------}/ (0-1000){------}\"\t\t------- --- -------\n");
        
strcat(minidialog"\"{------}/{------}\"\t\t\t----- ----------- ---\n");
        
strcat(minidialog"\"{------}/{------}\"\t\t------- -------- [-- ------ ---- --------]\n");
        
strcat(minidialog"\"{------}/{------}\"\t\t\t------------\n");
        
strcat(minidialog"\"{------}/{------}\"\t\t\t-----: ------, ------- VIP, ------\n");
        
strcat(minidialog"\"{------}/{------}\"\t\t------ ---------------\n");
        
strcat(minidialog"\"{------}/{------}\"\t\t\t"TEXT_CLAN_11" - VIP\n");
        
strcat(minidialog"\"{------}/{------}\"\t\t------- ----\n");
        
strcat(minidialog"\"{------}/{------}\"\t\t\t------ -- -------\n");
        
strcat(minidialog"\"{------}/{------}\"\t\t\t------ -- ----\n");
        
strcat(minidialog"\"{------}/{------}\"\t\t------- -------\n");
        
strcat(minidialog"\"{------}/{------}\"\t\t-------- ---- ---\n");
        
strcat(minidialog"\"{------}/{------}\"\t\t----- Moovie [----- --- ------ -----]\n");
        
strcat(minidialog"\"{------}/{------}\"\t\t---------- --------\n");
        
strcat(minidialog"\"{------}/ (ID){------}\"\t\t------- -------- -- ----\n");
        
strcat(minidialog"\"{------}/ (text){------}\"\t\t------ ----------\n");
        
strcat(minidialog"\"{------}/{------}\"\t\t-------- ------\n");
        
strcat(minidialog"\"{------}/{------}\"\t\t------ ---- ----------- ---");
    }
    
printf("1] %d",GetTickCount()-TickCount);
    
TickCount GetTickCount();
    new 
pos;
    for(new 
p500p++){
        
pos 0;
        
_strcat(minidialog"{------}\t\t----| ----------- ----: |----\n",pos);
        
_strcat(minidialog"----------- ------- ------- ---- - ----\n",pos);
        
_strcat(minidialog"\t----- --- --------- -----\n",pos);
        
_strcat(minidialog"\t\t------ ------ \"{------}Alt / 2{------}\"\n",pos);
        
_strcat(minidialog"\t\t------ ------ \"{------}Y{------}\"\n",pos);
        
_strcat(minidialog"\t\t----| -------------: |----\n",pos);
        
_strcat(minidialog"\"{------}/ (3-10){------}\"\t\t------\n",pos);
        
_strcat(minidialog"\"{------}/f{------}\"\t\t\t----------- ---- [--------]\n",pos);
        
_strcat(minidialog"\"{------}/ (1-2){------}\"\t\t-------- -- ---- ------\n",pos);
        
_strcat(minidialog"\"{------}/ (1-16){------}\"\t\t-------- -- ----- ------\n",pos);
        
_strcat(minidialog"\"{------}/ (0-99){------}\"\t\t------- ----------- ---\n",pos);
        
_strcat(minidialog"\"{------}/ (0-1000){------}\"\t\t------- --- -------\n",pos);
        
_strcat(minidialog"\"{------}/{------}\"\t\t\t----- ----------- ---\n",pos);
        
_strcat(minidialog"\"{------}/{------}\"\t\t------- -------- [-- ------ ---- --------]\n",pos);
        
_strcat(minidialog"\"{------}/{------}\"\t\t\t------------\n",pos);
        
_strcat(minidialog"\"{------}/{------}\"\t\t\t-----: ------, ------- VIP, ------\n",pos);
        
_strcat(minidialog"\"{------}/{------}\"\t\t------ ---------------\n",pos);
        
_strcat(minidialog"\"{------}/{------}\"\t\t\t"TEXT_CLAN_11" - VIP\n",pos);
        
_strcat(minidialog"\"{------}/{------}\"\t\t------- ----\n",pos);
        
_strcat(minidialog"\"{------}/{------}\"\t\t\t------ -- -------\n",pos);
        
_strcat(minidialog"\"{------}/{------}\"\t\t\t------ -- ----\n",pos);
        
_strcat(minidialog"\"{------}/{------}\"\t\t------- -------\n",pos);
        
_strcat(minidialog"\"{------}/{------}\"\t\t-------- ---- ---\n",pos);
        
_strcat(minidialog"\"{------}/{------}\"\t\t----- Moovie [----- --- ------ -----]\n",pos);
        
_strcat(minidialog"\"{------}/{------}\"\t\t---------- --------\n",pos);
        
_strcat(minidialog"\"{------}/ (ID){------}\"\t\t------- -------- -- ----\n",pos);
        
_strcat(minidialog"\"{------}/ (text){------}\"\t\t------ ----------\n",pos);
        
_strcat(minidialog"\"{------}/{------}\"\t\t-------- ------\n",pos);
        
_strcat(minidialog"\"{------}/{------}\"\t\t------ ---- ----------- ---",pos);
    }
    
printf("2] %d",GetTickCount()-TickCount); 
Код:
[13:48:40] 1] 21
[13:48:40] 2] 612
[13:52:13] 1] 19
[13:52:14] 2] 512
[13:52:18] 1] 20
[13:52:18] 2] 503
Reply
#8

Quote:
Originally Posted by Gettopro
Посмотреть сообщение
Мб не так понял чтото?)
Код:
[13:48:40] 1] 21
[13:48:40] 2] 612
[13:52:13] 1] 19
[13:52:14] 2] 512
[13:52:18] 1] 20
[13:52:18] 2] 503
И правда, я не знаю с чем это связано . Видимо лучше использовать memcpy, он в обоих случаях выдаёт хороший результат.
Reply


Forum Jump:


Users browsing this thread: