[Dъvida] Teste de velocidade Loop.
#1

Olб,
Apenas queria saber se esse simples teste de velocidade de execuзгo de loops(macro`s) й valido, se ele estб correto.
pawn Код:
#include <a_samp>

#define maxloop     (1000000)

#define Loop(%0,%1) \
    for(new %0 = 0; %0 != %1; ++%0)
   
#define Reloop(%0,%1) \
    for(new %0 = %1; %0 != -1; --%0)

new NTest1 = 4;
new TestTimer1;
new NTest2 = 4;
new TestTimer2;
public OnFilterScriptInit()
{
    TestTimer1 = SetTimer("Timer",2000,true);
    TestTimer2 = SetTimer("Timer2",2000,true);
    return 1;
}
forward Timer();
public Timer()
{
    new gc = GetTickCount();
    new a[11];
    Loop(x,maxloop)
    {
        Loop(z,11)
        {
            a[z] = (x*z);
        }
        if(a[0] == a[0] && x == x)
        {
            a[0]=(x*x);
            a[1]=((x+x)/5)+(a[5]*a[6]);
        }
    }
    printf("Resultado Loop: %d ,Repetido: %d mil vezes",(GetTickCount()  - gc),maxloop);
    NTest1--;
    if(NTest1 == 0) KillTimer(TestTimer1);
    return 1;
}
forward Timer2();
public Timer2()
{
    new gc = GetTickCount();
    new a[11];
    Reloop(x,maxloop)
    {
        Reloop(z,10)
        {
            a[z] = (x*z);
        }
        if(a[0] == a[0] && x == x)
        {
            a[0]=(x*x);
            a[1]=((x+x)/5)+(a[5]*a[6]);
        }
    }
    printf("Resultado Reloop: %d ,Repetido: %d mil vezes",(GetTickCount()  - gc),maxloop);
    NTest2--;
    if(NTest2 == 0) KillTimer(TestTimer2);
    return 1;
}
Resultados:
pawn Код:
[20:59:16] Resultado Loop, Tempo: 1480 ,Repetido: 1000000 mil vezes
[20:59:19] Resultado Loop, Tempo: 1508 ,Repetido: 1000000 mil vezes
[20:59:22] Resultado Loop, Tempo: 1483 ,Repetido: 1000000 mil vezes
[20:59:25] Resultado Loop, Tempo: 1481 ,Repetido: 1000000 mil vezes
[20:59:28] Resultado Reloop, Tempo: 1323 ,Repetido: 1000000 mil vezes
[20:59:31] Resultado Reloop, Tempo: 1280 ,Repetido: 1000000 mil vezes
[20:59:34] Resultado Reloop, Tempo: 1304 ,Repetido: 1000000 mil vezes
[20:59:37] Resultado Reloop, Tempo: 1316 ,Repetido: 1000000 mil vezes
Reply
#2

pawn Код:
#include <a_samp>

#define maxloop     (1000000)

#define Loop(%0,%1) \
    for(new %0 = 0; %0 != %1; ++%0)

#define Reloop(%0,%1) \
    for(new %0 = %1; %0 != -1; --%0)

new NTest1 = 4;
new NTest2 = 4;
public OnFilterScriptInit()
{
    Timer();
    Timer2();
    return 1;
}
forward Timer();
public Timer()
{
    new gc = GetTickCount();
    new a[11];
    Loop(x,maxloop)
    {
        Loop(z,11)
        {
            a[z] = (x*z);
        }
        if(a[0] == a[0] && x == x)
        {
            a[0]=(x*x);
            a[1]=((x+x)/5)+(a[5]*a[6]);
        }
    }
    printf("Resultado Loop: %d ,Repetido: %d mil vezes",(GetTickCount()  - gc),maxloop);
    NTest1--;
    return 1;
}
forward Timer2();
public Timer2()
{
    new gc = GetTickCount();
    new a[11];
    Reloop(x,maxloop)
    {
        Reloop(z,10)
        {
            a[z] = (x*z);
        }
        if(a[0] == a[0] && x == x)
        {
            a[0]=(x*x);
            a[1]=((x+x)/5)+(a[5]*a[6]);
        }
    }
    printf("Resultado Reloop: %d ,Repetido: %d mil vezes",(GetTickCount()  - gc),maxloop);
    NTest2--;
    return 1;
}
Tenta assim.
Reply
#3

Para executar o testa entre 2 circuitos realmente nгo й necessбrio colocar tantas vбriavels e pilhas,pois conformo o desempenho de seu computador elas podem vбriar a forma de execuзгo a atrasar o cуdigo,assim sendo um teste fail.

Aqui:

pawn Код:
#include <a_samp>

#define maxloop     (1000000)

#define Loop(%0,%1) \
    for(new %0 = 0; %0 != %1; ++%0)

#define Reloop(%0,%1) \
    for(new %0 = %1; %0 != -1; --%0)

public OnFilterScriptInit()
{
    new Tick;
    Tick = GetTickCount();
    Loop(x,maxloop * 4) { }
    printf("Resultado Loop: %d ,Repetido: %d mil vezes",GetTickCount()  - Tick,maxloop);
   
    Tick = GetTickCount();
    Reloop(x,maxloop * 4) { }
    printf("Resultado Reloop: %d ,Repetido: %d mil vezes",GetTickCount()  - Tick,maxloop);
    return 1;
}
Ah enquanto ao sistema estб correto,porйm ao inves de usar != use '>' ou '<' й muito mais leve na hora do processo.

E este seu sistema de loop,nгo й nada otimizado e sim uma simples definiзгo,tente fazer uma lista encadeada interna,й o melhor que se pode fazer em pawn
Reply
#4

@Garfield obrigado por tentar, mas teu forte й lasanha e cochilo na poltrona ( 0 L na brincadeira).
@Drakins valeu no inicio do pawn achava que < & > era mais rбpido mesmo, mas por costume dos outros cуdigos em que analizava sempre aparecia com mais freqькncia != entгo decidi sempre ultilizar tal(Desculpa fajuta), vou seguir teu conselho de usar uma lista encadeada, aproveitando o Post talvez alguem possa resolver essa minha outra questгo: https://sampforum.blast.hk/showthread.php?tid=216259
Reply
#5

Mas no caso de uma Lista encadeada serб necessбrio utilizar array multi dimensionais...

Entгo assim como Foreach em PHP,ou qualquer outras linguagem vocк precisa de 2 arrays


1: Value - Array para armazenar o valor do Iterator
2: Circuito/Loop - Array do circuito, estilizada para percorrer o Loop


Seria basicamente isto:

pawn Код:
#define Loop(%0,%1,%2,%3) for(new %1,%2; %0[%1] != %3; %2 = %0[++%1])
Agora use:

pawn Код:
new Array[10] = {02,185,1581,1510,11,8515,151};
    Loop(Array,x,y,sizeof(Array))
    {
        printf("Iterator: %d | Value: %d | Exception: %d",x,y,sizeof(Array));
    }
E veja,ele imprimi o valor do circuito e o valor da array equivalente ao nъmero do circuito representado pela array x.

Antes que me esqueзa o '%3' й excessгo,digamos que vocк queria que o Loop nгo percorra o nъmero tal.
No caso eu coloquei como sizeof porque nгo precisei de nenhum excessгo,era apenas um teste.
Reply


Forum Jump:


Users browsing this thread: 1 Guest(s)