Sie sind nicht angemeldet.

Lieber Besucher, herzlich willkommen bei: sourceserver.info. Falls dies Ihr erster Besuch auf dieser Seite ist, lesen Sie sich bitte die Hilfe durch. Dort wird Ihnen die Bedienung dieser Seite näher erläutert. Darüber hinaus sollten Sie sich registrieren, um alle Funktionen dieser Seite nutzen zu können. Benutzen Sie das Registrierungsformular, um sich zu registrieren oder informieren Sie sich ausführlich über den Registrierungsvorgang. Falls Sie sich bereits zu einem früheren Zeitpunkt registriert haben, können Sie sich hier anmelden.

Impact

Super Moderator

  • »Impact« ist der Autor dieses Themas

Beiträge: 1 276

Rootserver vorhanden: Nein

  • Nachricht senden

1

Samstag, 10. März 2012, 19:17

Optimierung die Zweite

Optimieren von Scripts ist ein wichtiger Grundsatz den jeder Entwickler befolgen sollte, allerdings ist es nicht immer leicht die "langsamen" Stellen in seinem Code zu finden.
In dem zweiten Post dieser kleinen Reihe möchte ich ein weiteres Beispiel zeigen wie man seinen Code optimieren kann.

Ich hatte mir zum testen dieses kleine Stückchen Code genommen.

PHP-Quelltext

1
2
3
4
5
6
7
8
9
10
11
static Modulo;

for(new i<= RUNSi++)
{
    Modulo 2;
    
    if(Modulo == 0)
    {
        Func_Nothing();
    }
}

RUNS ist ein define den ich auf 1000 Durchläufe festgelegt habe.

Diese Funktion macht folgendes, wenn die Variable i welche jeden Durchlauf um 1 erhöht wird eine gerade Zahl ist (2, 4, 6, 8, ...) dann wird eine Funktion aufgerufen die keinen Inhalt hat.
Im Durchschnitt kam ich auf: 0.000006 Sekunden

Verändern wir das Stückchen Code nun ein kleines bisschen

PHP-Quelltext

1
2
3
4
5
6
7
8
9
for(new i<= RUNSi++)
{
    Modulo 2;
    
    if(!Modulo)
    {
        Func_Nothing();
    }
}

Mit dieser kleinen Änderung kam ich auf durchschnittlich: 0.000008 Sekunden

Ich werde nun noch einige andere Beispiele der selben Funktion und deren Zeiten auflisten, das Ergebnis wird euch sicher erstaunen.

PHP-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
for(new i<= RUNSi++)
{
    Modulo 2;
    
    if(Modulo != 0)
    {
        continue;
    }
    
    Func_Nothing();
    
}

0.000007 Sekunden


PHP-Quelltext

1
2
3
4
5
6
7
8
9
10
11
for(new i<= RUNSi++)
{
    Modulo 2;
    
    if(Modulo <= 1)
    {
        continue;
    }
    
    Func_Nothing();
}

0.000004 Sekunden


PHP-Quelltext

1
2
3
4
5
6
7
8
9
10
11
for(new i<= RUNSi++)
{
    Modulo 2;
    
    if(Modulo >= 0)
    {
        continue;
    }
    
    Func_Nothing();
}

0.000004 Sekunden


PHP-Quelltext

1
2
3
4
5
6
7
8
9
for(new i<= RUNSi++)
{
    Modulo 2;
    
    if(Modulo >= 0)
    {
        Func_Nothing();
    }
}

0.000009 Sekunden


PHP-Quelltext

1
2
3
4
5
6
7
8
9
for(new i<= RUNSi++)
{
    Modulo 2;
    
    if(Modulo <= 0)
    {
        Func_Nothing();
    }
}

0.000006 Sekunden


PHP-Quelltext

1
2
3
4
5
6
7
8
9
for(new i<= RUNSi++)
{
    Modulo 2;
    
    if(!(Modulo 0))
    {
        Func_Nothing();
    }
}

0.000010 Sekunden

Es gibt natürlich noch dutzende andere Möglichkeiten diese Abfrage zu schreiben, aber dies waren die am häufigst gesehen.
Allerdings gilt auch hier dieses Prinzip.
Hier noch der gesamte Code zum selbst testen

Spoiler Spoiler


PHP-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
#include <sourcemod>
#include <profiler>
#pragma semicolon 1



new Handle:g_prof;



public OnPluginStart()
{
    RegConsoleCmd("sm_test"Command_Test);
    g_prof CreateProfiler();
}



#define RUNS 1000


public Action:Command_Test(clientargs)
{
    StartProfiling(g_prof);

    static Modulo;

    
    for(new i<= RUNSi++)
    {
        Modulo 2;
        
        if(Modulo == 0)
        {
            Func_Nothing();
        }
        
    }
    
    
    
    StopProfiling(g_prof);
    PrintToServer("Benchmark: %f seconds"GetProfilerTime(g_prof));

    return Plugin_Handled;
}


stock Func_Nothing()
{
}



Interessant, nicht wahr?

MfG
Impact