neuer Befehl append - Speedcheck

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • neuer Befehl append - Speedcheck

    Hallo,

    aus Interesse eben den seit 1.40 verfügbaren Befehl append gepürft. Der neue Befehl soll 2 Arrays zusammen fügen und dabei als Ersatz für die simple und langsame Addition zweier Arrays dienen. Das Ergebnis ist leider nicht so toll.
    Ich habe jeweils 10.000mal das Array _b, bestehend aus einer Zahl, in das Array _a übertragen. Folgende Ergebnisse in s: (avg. über 3 Versuche) (Das Ergebnis ist immer ein Array in dem 10.000mal eine Zahl steht. Also [1,1,1,1,1,1,......])

    Addition: _a = _a + _b;
    4,42s

    append: _a append _b;
    0,19s

    ...bis hier hin ganz gut. Wenn man jedoch mit dem set-Befehl vergleicht...
    set: _a set [count _a, _b select 0];
    0,12s


    Der neue Befehl ist also (fast) nutzlos. Hier noch mein vollständig verwendeter Code zum prüfen. Falls ich einen Denkfehler habe bitte korrigieren!

    Quellcode

    1. hint "start";
    2. diag_log format ['%1',time];
    3. private ['_a','_b'];
    4. _a = []; _b = [1];
    5. for "_i" from 0 to 9999 do {
    6. _a set [count _a, _b select 0];
    7. //_a append _b;
    8. //_a = _a + _b;
    9. };
    10. diag_log format ['%1',time];
    11. hint "ende";
    12. diag_log format ['%1',_a];
    Alles anzeigen



    Grüße

    ___<<<my A2 Missions>>>___<<<A3 Wounding System>>>___
  • Psychobastard schrieb:

    Hallo,

    aus Interesse eben den seit 1.40 verfügbaren Befehl append gepürft. Der neue Befehl soll 2 Arrays zusammen fügen und dabei als Ersatz für die simple und langsame Addition zweier Arrays dienen. Das Ergebnis ist leider nicht so toll.
    Ich habe jeweils 10.000mal das Array _b, bestehend aus einer Zahl, in das Array _a übertragen. Folgende Ergebnisse in s: (avg. über 3 Versuche) (Das Ergebnis ist immer ein Array in dem 10.000mal eine Zahl steht. Also [1,1,1,1,1,1,......])

    Addition: _a = _a + _b;
    4,42s

    append: _a append _b;
    0,19s

    ...bis hier hin ganz gut. Wenn man jedoch mit dem set-Befehl vergleicht...
    set: _a set [count _a, _b select 0];
    0,12s


    Der neue Befehl ist also (fast) nutzlos. Hier noch mein vollständig verwendeter Code zum prüfen. Falls ich einen Denkfehler habe bitte korrigieren!

    Quellcode

    1. hint "start";
    2. diag_log format ['%1',time];
    3. private ['_a','_b'];
    4. _a = []; _b = [1];
    5. for "_i" from 0 to 9999 do {
    6. _a set [count _a, _b select 0];
    7. //_a append _b;
    8. //_a = _a + _b;
    9. };
    10. diag_log format ['%1',time];
    11. hint "ende";
    12. diag_log format ['%1',_a];
    Alles anzeigen



    Grüße


    wenn er das <array> + <array> ersetzen soll darfst du ihn auch nicht mit set/pushBack vergleichen
    <array> + <array> erstellt ein NEUES array und fügt nicht dem altem etwas hinzu
    daher ist das was am ende herraus kommt ein neues array

    wenn BI nun das verhalten mit noch mehr performance nachgebaut hat
    großartig
    wenn es nur zum mergen ist
    auch gut
    (zum mergen von arrays benutzt man übrigens kein set ^^ set ist zum hinzufügen eines elementes z.b. und selbst dazu wurde es von pushBack abgelöst wodurch es nur noch das gegenstück zum select ist)
    [hr][/hr]edit[hr][/hr]
    nachdem ich kurz die wiki mir durchgelesen habe musste ich folgendes feststellen:
    append ist keine alternative zu <array> + <array> da der sinn von <array> + <array> ist ein neues array zu erstellen und keine referenz. dadurch erfüllt append den tatbestand eines tatsächlich "neuem" befehls der NUR zum mergen von array a und b da ist
    dabei ist zu erwähnen dass das linke array um das rechte erweitert wird

    ob dabei der rechte teil als referenz gehandelt wird oder nicht sollte noch geprüft werden
  • Quellcode

    1. hint "start";
    2. diag_log format ['%1',time];
    3. private ['_a','_b'];
    4. _a = [];
    5. _b = [1];
    6. for "_i" from 0 to 9999 do {
    7. _a pushback _b;
    8. };
    9. diag_log format ['%1',time];
    10. hint "ende";
    11. diag_log format ['%1',_a];
    Alles anzeigen


    Das Problem mit Arrays ist immer das selbe, meist sind sie nicht effektiv aufgebaut bzw. nicht richtig genutzt.
    Im moment führe ich alle intensiven berechnungen auf andere art aus z.B. über Plugins (dll) spart Zeit wie sau.
    Desweiteren kommt es mehr darauf an wie ich meine Scripte/Funktionen aufrufe, man kann hier extrem schnelle und aufwendige Scripte ermöglichen. Mehr dazu in meinen Tutorien ;P

    MfG