Javascript IE / FF

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Javascript IE / FF

    Hallo zusammen,

    habe auf meiner Seite ein kleines JS zur Berechnung von Primzahlen hingestellt. Das besiert auf dem Sieb des Eratosthenes . Es funzt soweit alles wie gewüncht (na ja fast alles)

    Bei der Ausführung des Scriptes kann man aber eklatante Unterschiede in der Ausführungszeit zwischen IE und FF erkennen.
    Beim Zahlenbereich 0-10000 dauert die Suche im FF ca 45 Sekunden, im IE hingegen ca 150 sek. Auch bei kleineren Werten gilt dasselbe: IE dauert mindestens 2 mal länger als FF.
    Habe ich denn in folgendem Code einen Stolperstein für IE eingebaut, ohne es zu wissen. ?
    PHP-Code:
    //ist natürlich JS Code ;-)
    zahlen = new Array(5001);
    function 
    primen(){
        
    document.getElementById('prim'+0).style.backgroundColor 'red';
        
    document.getElementById('prim'+1).style.backgroundColor 'red';
        var 
    ii 0;
        while(
    ii zahlen.length){
            
    zahlen[ii] = 1;
            
    ii++;
        }
        
    zahlen[0] = 0;
        
    zahlen[1] = 0;
        var 
    ende_abs;
        
    ende_abs Math.sqrt(zahlen.length);
        
    ende_abs parseInt(ende_abs);
        
    ende_abs ende_abs+1;
        for(var 
    <= ende_abs;i++){
            
    ende zahlen.length/i;
            
    ende parseInt(ende);
            if(
    zahlen[i] == && ende_abs){
                continue;
            }
            var 
    iii i;
            while(
    iii <= ende){
                if(
    zahlen[i] == 0){
                    
    iii++;
                    continue;
                }else{
                    
    zahl iii;
                    if(
    zahl >= zahlen.length){
                        break;
                    }
                    
    document.getElementById('prim'+zahl).style.backgroundColor 'red';
                    
    zahlen[zahl] = 0;
                    
    iii++;
                }
            }
        }
        var 
    primes 0;
        var 
    str '';
        for(var 
    0;i<=zahlen.length;i++){
            if(
    zahlen[i] == 1){
                
    primes++;
                
    document.getElementById('prim'+i).style.backgroundColor 'green';
                
    str str+i+' ';
            }
        }
        return 
    str;

    Für Eure Tipps bin ich Euch dankbar.
    Gruss

    tobi
    Gutes Tutorial | PHP Manual | MySql Manual | PHP FAQ | Apache | Suchfunktion für eigene Seiten

    [color=red]"An error does not become truth by reason of multiplied propagation, nor does truth become error because nobody sees it."[/color]
    Mohandas Karamchand Gandhi (Mahatma Gandhi) (Source)

  • #2
    Ich habe nicht viel Ahnung von Javascript und den browserspezifischen Interna, aber die Aufrufe von document.getElementById() scheinen mir das einzige zu sein, wo du überhaupt Unterschiede erzeugen könntest.
    Um das zu prüfen, versuch mal die alle aus den Schleifen auszulagern. Kannst zum Beispiel erstmal alle Werte in einem Array speichern. Nach den Schleifen gibst du dann die echte Rechenzeit aus, um zu sehen ob die in beiden Browsern gleich ist und anschließend läufst du über den Array und holst die document.getElementById's nach.

    Kommentar


    • #3
      Nach den Schleifen gibst du dann die echte Rechenzeit aus, um zu sehen ob die in beiden Browsern gleich ist und anschließend läufst du über den Array und holst die document.getElementById's nach.
      Genauso werde ich das mal probieren und von den Ergebnissen berichten.

      Danke und gute Nacht

      tobi
      Gutes Tutorial | PHP Manual | MySql Manual | PHP FAQ | Apache | Suchfunktion für eigene Seiten

      [color=red]"An error does not become truth by reason of multiplied propagation, nor does truth become error because nobody sees it."[/color]
      Mohandas Karamchand Gandhi (Mahatma Gandhi) (Source)

      Kommentar


      • #4
        @onemorenerd
        Habe mal wie du geschrieben hast alle getElementById rausgenommen. Ich wusste ja nicht, dass die eine solche Tempobremse sind. Statt 45 Sekunden dauert es nun 0.093 sek um die 1229 Primzahlen von 0-10000 im FF zu errechnen. Der IE hat jedoch trotzdem noch 0.125 sek d.h. gut 34% mehr Rechenzeit. Aber auch der ist gewaltig runtergekommen mit der benötigten Zeit.

        Ich werde weiter versuchen den Code zu optimieren. Da ich aber die Elemente farblich markieren möchte, werde ich wohl oder übel wieder mit getElementById arbeiten müssen.

        Danke und Gruss

        tobi
        Gutes Tutorial | PHP Manual | MySql Manual | PHP FAQ | Apache | Suchfunktion für eigene Seiten

        [color=red]"An error does not become truth by reason of multiplied propagation, nor does truth become error because nobody sees it."[/color]
        Mohandas Karamchand Gandhi (Mahatma Gandhi) (Source)

        Kommentar


        • #5
          Ich habe in meiner langen Nachschicht, den Code noch weiter optimiert. Vom Einfärben der Primzahlen in der HTML Tabelle musste ich Abstand nehmen, denn das ist der eigentliche Zeitfresser.
          Die Unterschiede zwischen IE und FF sind nun wieder enorm. Ich habe nun 2 Fkt: eine streicht alle Komposit Zahlen aus dem Array. Die andere Fkt läuft dieses Array durch und zählt, wenn der Feld Wert eins ist, die Anzahl primes um eins hoch. Ausserdem erstelle ich einen String, den ich am Ende mit allen Primzahlen ausgeben möchte.
          Der String wird mit document.createTextNode(string) in einem div mit der id prim abgelegt.
          Die Berechnung der Primen 0- 100'000 dauert im FF ca 0.7 sek im IE hingegen 1.0. Eklatant wird die ganze Sache wenn ich auch die Zeit messe, die die Browser brauchen um den String mit den Primzahlen einzuhängen:
          FF 0.02 Sek und der IE 25 Sekunden

          Gruss

          tobi
          Gutes Tutorial | PHP Manual | MySql Manual | PHP FAQ | Apache | Suchfunktion für eigene Seiten

          [color=red]"An error does not become truth by reason of multiplied propagation, nor does truth become error because nobody sees it."[/color]
          Mohandas Karamchand Gandhi (Mahatma Gandhi) (Source)

          Kommentar


          • #6
            PHP-Code:
            /*dieser Code Schnippel geht das Array mit 100'000 Elementen 
            durch und prüft die Werte auf 1 oder 0
            Dies ist der Bereich, wo IE und FF den grossen Unterschied ergeben
            IE ca 25 Sek für diesen Bereich / FF hingegen 0.025*/
            var start = new Date;
            for(var 
            i=0;i<zahlen.length;i++){
                if(
            zahlen[i] == 1){
                    
            str str+i+' ';
                    
            primes++;
                }
            }
            var 
            end = new Date;
            var 
            dauer_array end.getTime() - start.getTime();
            dauer_array dauer_array/1000;
            dauer_array dauer_array.toString();
            dauer_array dauer_array.substr(0,6); 
            Könnt ihr Euch das allenfalls erklären, warum der IE hier soviel länger braucht ?

            Gruss + Danke

            tobi

            EDIT:

            http://www.tobisworld.ch/primen/prim.php

            Zuletzt geändert von jahlives; 10.01.2006, 07:29.
            Gutes Tutorial | PHP Manual | MySql Manual | PHP FAQ | Apache | Suchfunktion für eigene Seiten

            [color=red]"An error does not become truth by reason of multiplied propagation, nor does truth become error because nobody sees it."[/color]
            Mohandas Karamchand Gandhi (Mahatma Gandhi) (Source)

            Kommentar


            • #7
              Auch Opera macht ned mit

              Wie der Titel schon sagt, habe ich beim Testen des Scripts auch noch ne kleine Macke bei Opera (Version 8.5 Build 7700) entdeckt. Er scheint Probleme damit zu haben einen String grösser als eine bestimmte Länge mittels append.child anzufügen.
              PHP-Code:
              str document.createTextNode(str);
              if(
              document.getElementById("prim") != undefined){
                
              document.getElementById("prim").removeChild(document.getElementById("prim").lastChild);
              }
              document.getElementById('prim').appendChild(str); 
              Bei der Anzeige aller Primzahlen zwischen 0 und 100'000 ist bei Opera immer bei der Zahl 56167 Schluss.
              Das entspricht ca 50% aller 9592 Primzahlen in diesem Bereich.

              Irgendwie strange...

              Gruss

              tobi
              Gutes Tutorial | PHP Manual | MySql Manual | PHP FAQ | Apache | Suchfunktion für eigene Seiten

              [color=red]"An error does not become truth by reason of multiplied propagation, nor does truth become error because nobody sees it."[/color]
              Mohandas Karamchand Gandhi (Mahatma Gandhi) (Source)

              Kommentar


              • #8
                Ich habe mal die Position im String ermittelt, wo Opera immer stoppt. Es ist dies immer das 32766.te Zeichen des Strings. Wenn das jetzt nicht Javascript wäre würde mir da spontan etwas von integer einfallen. Aber ich dachte eigentlich, dass JS in diesem Sinne nur nummerische von nicht-nummerischen Variabeln unterscheidet.

                Na ja in allen anderen Browsern al IE oder Opera funzt es
                Gruss

                tobi
                Gutes Tutorial | PHP Manual | MySql Manual | PHP FAQ | Apache | Suchfunktion für eigene Seiten

                [color=red]"An error does not become truth by reason of multiplied propagation, nor does truth become error because nobody sees it."[/color]
                Mohandas Karamchand Gandhi (Mahatma Gandhi) (Source)

                Kommentar

                Lädt...
                X