Zurück   Flashforum > Flash > ActionScript > Softwarearchitektur und Entwurfsmuster

Antwort
 
LinkBack Themen-Optionen Ansicht
Alt 21-06-2003, 20:23   #1 (permalink)
[Ernst Reiter]
 
Benutzerbild von Scrawer
 
Registriert seit: Jul 2001
Ort: austria
Beiträge: 3.691
Question primitive datentypen, new String(object), String(function) usw...

Hallo... evtl kann mir einer eine erklärung zu meinen test abgeben... mir ist da was unklar

ActionScript:
  1. // ::: Version 1 'mit' Type-Casting von Flash (flash muss den datentyp erst ermitteln)
  2. var n = 1;
  3. var s = 'test string';
  4. var b = true;
  5. // ::: Variabeln Auflisten 'ausgabe-fenster'
  6. // Variable _level0.n = 1
  7. // Variable _level0.s = "test string"
  8. // Variable _level0.b = true
  9.  
  10.  
  11. // ::: Version 2 'ohne' Type-Casting von Flash: erstellung über Object
  12. var n = new Number(1);
  13. var s = new String('test string');
  14. var b = new Boolean(true);
  15. // ::: Variabeln Auflisten 'ausgabe-fenster'
  16. // Variable _level0.n = [Objekt #1, Klasse 'Number'] {1}
  17. // Variable _level0.s = [Objekt #2, Klasse 'String'] {test string}
  18. // Variable _level0.b = [Objekt #3, Klasse 'Boolean'] {true}
  19.  
  20.  
  21. // :::::::: nun der performance test ::::::::
  22. t = getTimer();
  23. for(i=0; i<10000; i++)
  24. {
  25.     if(b) temp = s.charAt(n);
  26. }
  27. trace(getTimer()-t);
  28.  
  29. // ergebnis version 1: 1173 ms
  30. // ergebnis version 2: 867  ms
  31.  
so weit ist mir auch alles k und beruht ja auch einem logischen hindergrund....
da flash den datentyp in version 2 nicht immer ermitteln muss.. geht es schneller...
was mir nun nicht ganz in den kopf möchte ist was bei version 3 rauskommt
ActionScript:
  1. // ::: Version 3 'ohne' Type-Casting von Flash: erstellung über Object, jedoch wird value erst nach dem erstellen der var gesetzt
  2. var n = new Number();
  3. var s = new String();
  4. var b = new Boolean();
  5.  
  6. n = 1;
  7. s = 'test string';
  8. b = true;
  9. // ::: Variabeln Auflisten 'ausgabe-fenster'
  10. // Variable _level0.n = 1
  11. // Variable _level0.s = "test string"
  12. // Variable _level0.b = true
  13.  
die drei Werte sind nun keine Objekts mehr... bzw wurden sie wohl überschrieben?
wenn ich da einen performance test mache komme ich aufs selbe raus wie bei version 1.
nun über Function
ActionScript:
  1. // ::: Version 4 'ohne' Type-Casting von Flash: erstellung über 'Function'!!!
  2. var n = Number(1);
  3. var s = String('test string');
  4. var b = Boolean(true);
  5. // ::: Variabeln Auflisten 'ausgabe-fenster'
  6. // Variable _level0.n = 1
  7. // Variable _level0.s = "test string"
  8. // Variable _level0.b = true
  9.  
Wenn ich da (vers4) einen performance test mache komme ich bei Vers4 aufs selbe raus wie bei version 1 und 3.
und bei typeof und instanceof kommt auch das raus was man erwarten würde...

Irgendwie will mir das nicht in den Kopf... also bringt es mir gar nix wenn ich eine
var mit new String() z.b. erstelle.. sobald ich den wert ändern möchte ist er wieder
ein primitiver datentyp.. wo flash bei jedem zugriff erst den type ermitteln muss.
Gibt es einen anderen weg den wert zu ändern? kann ja nicht sein das ich
jedes mal den new Operator verwenden müsste?
vor allem weil das schon wieder (in einer schleife) mehr leistung brauchen würde...
gibt es einen weg an die var ranzukommen?
habe ich da was falsch vestanden oder ist das einfach so?
Seh den Wald vor lauter Bäumen nicht mehr... gr

ähnlicher beitrag aus dem forum hier
__________________
Das Gesetz des Lebens liegt im Notwendigen. Der Reiz des Lebens liegt im Überflüssigen
m.f.g Scrawer (www.thinkspace.at)
Scrawer ist offline   Mit Zitat antworten
Alt 21-06-2003, 20:41   #2 (permalink)
helpQLODhelp
 
Benutzerbild von bokel
 
Registriert seit: Feb 2002
Ort: Köln
Beiträge: 8.505
Re: primitive datentypen, new String(object), String(function) usw...

Zitat:
Irgendwie will mir das nicht in den Kopf... also bringt es mir gar nix wenn ich eine var mit new String() z.b. erstelle.. sobald ich den wert ändern möchte ist er wieder ein primitiver datentyp..
Genau. Das bringt nur was, wenn du einen String oefter benutzt, zum Beispiel beim Durchlaufen eines Strings mit charAt

mfg r.
bokel ist offline   Mit Zitat antworten
Alt 21-06-2003, 21:15   #3 (permalink)
[Matthias K.] - Moderator
 
Benutzerbild von Madokan
 
Registriert seit: Jun 2001
Ort: Berlin/Germany - and the hole World !
Beiträge: 9.971
Scrawer - leider setzt nach der Wertzuweisung Flash wieder auf seine automatische Typenkonvertierung und da geht er hin der Performance gewinn.

Liebe Grüsse
Matze K.
Madokan ist offline   Mit Zitat antworten
Alt 22-06-2003, 15:37   #4 (permalink)
[Ernst Reiter]
 
Benutzerbild von Scrawer
 
Registriert seit: Jul 2001
Ort: austria
Beiträge: 3.691
dank euch!

wäre auch zu schön gewesen.. wobei es schon eine logik hat nun ja

hatte mir schon gedacht... wäre ja toll am anfang einer function nicht nur

var index, name, check;
usw zu machen... sondern gleich

var index = new Number()
var name = new String()
var check = new Boolean()

hätte ich fast in meine Konventions mit aufgenommen aus grund der Übersichtlichkeit.. und performance...
nur kann ich mir das nun schenken
den nur wegen der übersicht...
__________________
Das Gesetz des Lebens liegt im Notwendigen. Der Reiz des Lebens liegt im Überflüssigen
m.f.g Scrawer (www.thinkspace.at)
Scrawer ist offline   Mit Zitat antworten
Alt 22-06-2003, 15:46   #5 (permalink)
helpQLODhelp
 
Benutzerbild von bokel
 
Registriert seit: Feb 2002
Ort: Köln
Beiträge: 8.505
Nicht nur das, es ist unter Umständen sogar kontraproduktiv:

ActionScript:
  1. b = new Boolean( false);
  2. if( b) trace("hm");

Ausgabe
hm

Also lieber nicht

mfg r.
bokel ist offline   Mit Zitat antworten
Alt 22-06-2003, 16:33   #6 (permalink)
[Ernst Reiter]
 
Benutzerbild von Scrawer
 
Registriert seit: Jul 2001
Ort: austria
Beiträge: 3.691
jep.. ist so.. habe ich bei denn test gestern schnell bemerkt
ActionScript:
  1. b1 = new Boolean(true)
  2. b2 = Boolean(true);
  3. b3 = true;
  4.  
  5. trace(typeof b1);
  6. trace(typeof b2);
  7. trace(typeof b3);
  8.  
  9. // ausgabe:
  10. object
  11. boolean
  12. boolean
__________________
Das Gesetz des Lebens liegt im Notwendigen. Der Reiz des Lebens liegt im Überflüssigen
m.f.g Scrawer (www.thinkspace.at)
Scrawer ist offline   Mit Zitat antworten
Alt 22-06-2003, 17:39   #7 (permalink)
[Matthias K.] - Moderator
 
Benutzerbild von Madokan
 
Registriert seit: Jun 2001
Ort: Berlin/Germany - and the hole World !
Beiträge: 9.971
Wirklich schade!

Liebe Grüsse
Matze K.
Madokan ist offline   Mit Zitat antworten
Alt 22-06-2003, 17:45   #8 (permalink)
LastActionScriptHero
 
Benutzerbild von k7c4
 
Registriert seit: Apr 2002
Beiträge: 572
@scrawer

Bei Deinem Beispiel
ActionScript:
  1. n = new Number(2);
  2. n = 1;

passiert dorch das gleiche wie wenn Du schreibst
ActionScript:
  1. n = new Array(1,2,3);
  2. n = 1;

Zuerst ist n eine Variable mit irgendeinem Wert (bei Dir ein String-Objekt). Durch Deine Zuweisung auf diese Variable gibst Du ihr einen neuen Wert, dessen Typ unabhängig ist von dem Wert, den die Variable vorher besessen hat.

Der Gewinn geht nicht flöten, wenn Du so was machst
ActionScript:
  1. n = new Number(2)
  2. n = new Number(n+1) // statt n = n+1
  3. // nun ist n weiterhin ein Objekt
  4.  

oder
ActionScript:
  1. s = new String("hallo")
  2. s = new String(s + " Du!")

Ich denke, Du verstehst, was ich meine
__________________
All your AS are belong to us! haha!
Beweise heute Deine Tierliebe: Schlage nie ein totes Pferd!
k7c4 ist offline   Mit Zitat antworten
Alt 22-06-2003, 21:09   #9 (permalink)
[Ernst Reiter]
 
Benutzerbild von Scrawer
 
Registriert seit: Jul 2001
Ort: austria
Beiträge: 3.691
schon richtig... aber ich möchte ja nicht jedes mal wenn ich den wert ändern muss über den new operator gehen
mal abgesehen von der tipp Arbeit und Dateigröße braucht das auch sehr viel mehr leistung...
da eben immer eine neue Instanz erstellt wird....
ActionScript:
  1. t = getTimer();
  2. for(i=0; i<10000; i++)
  3. {
  4.         n += i;
  5. }
  6. trace(getTimer()-t);
  7. // ergebnis version 1: 535 ms
  8.  
  9. // :::::::::
  10.  
  11. t = getTimer();
  12. for(i=0; i<10000; i++)
  13. {
  14.         n = new Number(n+i);
  15. }
  16. trace(getTimer()-t);
  17. // ergebnis version 2: 885  ms
  18.  
__________________
Das Gesetz des Lebens liegt im Notwendigen. Der Reiz des Lebens liegt im Überflüssigen
m.f.g Scrawer (www.thinkspace.at)
Scrawer ist offline   Mit Zitat antworten
Alt 22-06-2003, 21:45   #10 (permalink)
Lord of the Strings
 
Benutzerbild von Leprosy
 
Registriert seit: Sep 2001
Beiträge: 252
Ich denke wenn man den new Operator an bestimmten kritischen Stellen gezielt einsetzt, ist das sicher nicht schlecht. Außerdem könnte es sich bei Konstanten als nützlich erweisen, da die ja nicht mehr überschrieben werden (oder zumindest sollte sie das nicht).
ActionScript:
  1. _global.MYCON = new Boolean(true);
Das bringt vielleicht schon einiges, wenn man so Sachen wie SPEED bei der Berechnung von Bewegungsabläufen so festlegt. Oder diverse Parameter bei 3D-Engines - obwohl da ja meistens sowieso alles für die Katz ist.
__________________
Leprosy
Psynoxis
Leprosy ist offline   Mit Zitat antworten
Alt 23-06-2003, 09:04   #11 (permalink)
[Ernst Reiter]
 
Benutzerbild von Scrawer
 
Registriert seit: Jul 2001
Ort: austria
Beiträge: 3.691
richtig.. mein fazit ist:

- es macht eigentlich nur sinn für Strings und Number in einer schleife und da eben nur 'read only'!
dort kannst damit performance raushollen.....

Fakt ist in den meisten Fällen wie eben 3D wo performance ja eine tolle
Sache wäre bringt es nix.. denn dort ist 'read/write' angesagt.

- für boolean.. gefährlich.. da bei typeof nicht mehr 'boolean' raus kommt und auch eine
if abfrage nicht mehr richtig möchte... wie auch bokel oben sagte....

Praktisch gesehen.... ist es für schleifen in den Strings zerlegt oder
Durchsucht werden.. z.b. für crypt/decrypt functions, search engines
usw.... schon eine leistungs steigerung....

ein letztes praktisches Beispiel dafür:
ActionScript:
  1. t = getTimer();
  2. str = 'das ist ein test string der nun zerlegt wird';
  3. arr = [];
  4.  
  5. for(i=0; i<str.length; i++)
  6. {
  7.         arr[i] = str.charAt(i);
  8. }
  9. trace(getTimer()-t);
  10.  
  11. // ::::
  12.  
  13. t = getTimer();
  14. str = new String('das ist ein test string der nun zerlegt wird');
  15. arr = [];
  16.  
  17. for(i=0; i<str.length; i++)
  18. {
  19.         arr[i] = str.charAt(i);
  20. }
  21. trace(getTimer()-t);
  22.  
  23. // version 1: 10 ms
  24. // version 2: 5 ms
  25.  

das zahlt sich schon aus bei langen strings....
__________________
Das Gesetz des Lebens liegt im Notwendigen. Der Reiz des Lebens liegt im Überflüssigen
m.f.g Scrawer (www.thinkspace.at)
Scrawer ist offline   Mit Zitat antworten
Antwort

Lesezeichen

Themen-Optionen
Ansicht

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks sind an
Pingbacks sind an
Refbacks sind an



Alle Zeitangaben in WEZ +1. Es ist jetzt 15:40 Uhr.

Domains, Webhosting & Vserver von Host Europe
Unterstützt das Flashforum!
Adobe User Group


Copyright ©1999 – 2012 Marc Thiele