romero: Script verursacht, dass das IE langsam läuft

Hallöchen an Euch,

wie der Betreff schon sagt, verursacht mein Script, dass das IE langsam läuft.
Das kommt daher, dass ich eine sehr sehr große Datenmenge suchen und als eine Art Index in mehreren .*txt's abspeichere.

Nun kommt da diese Fehlermeldung:

"A script on this page is causing Internet Explorer run slowly. If it continues to run,your computer may become unresponsive.

Do you want to abort the script?"

Y / N

Wie kann ich direkt oder indirekt verhindern, dass diese Meldung kommt? Weil müsste ja dann auf NEIN klicken damit es weiter läuft.

Ich will ja dieses Script im Hintergrund aller 1-2h laufen lassen. Aber da sind solche Störungen halt belastend.

LG Romero

  1. Wie kann ich direkt oder indirekt verhindern, dass diese Meldung kommt? Weil müsste ja dann auf NEIN klicken damit es weiter läuft.

    Der IE10 unterstützt Websockets, also echtes Mulithreading für Javascript.
    Ansonsten versuche Performace-Probleme in deinem Code zu finden und ggf. zu optimieren oder du lagerst den Code auf den Webserver aus.

    1. Hallöchen 1UnitedPower,

      Der IE10 unterstützt Websockets, also echtes Mulithreading für Javascript.
      Ansonsten versuche Performace-Probleme in deinem Code zu finden und ggf. zu optimieren oder du lagerst den Code auf den Webserver aus.

      Bisher arbeite ich entweder mit IE6 bzw. IE8.
      Mein Script ist eine *.HTA-Datei, wo nur der Javascript-Code ausgeführt wird.

      Naja Performance-Probleme sind ja von vornherein gegeben, da es sich um eine riesige Menge an Daten handelt.

      Also um es kurz zu beschreiben:
      Ich habe mehrere Ordner mit einer unterschiedlichen Anzahl (bis zu weit über 5000) an Daten (*.txt-Dateien).
      Diese Daten möchte ich nach einer bestimmten Aktualität (in dem Falle ist nicht das Datum ausschlaggebend sondern eine Art Kennbuchstabe, je höher, desto aktueller ist diese *.txt-Datei) in eine neue *.txt-Datei schreiben, damit mein Hauptscript nur noch diese neue TXT aufruft und sich da nur die aktuellsten *.txt's holt. Also eine Art Index.

      Unterm Strich sind das weit über 130.000!!! Dateien. Und sowas kann ich nur im Hintergrund laufen lassen ohne irgendwelche Meldungen über "zu langsam laufendes IE".

      LG Romero

      1. Hallöchen 1UnitedPower,

        Der IE10 unterstützt Websockets, also echtes Mulithreading für Javascript.
        Ansonsten versuche Performace-Probleme in deinem Code zu finden und ggf. zu optimieren oder du lagerst den Code auf den Webserver aus.

        Bisher arbeite ich entweder mit IE6 bzw. IE8.
        Mein Script ist eine *.HTA-Datei, wo nur der Javascript-Code ausgeführt wird.

        Dein Problem ist die ausführende Umgebung. Warum eigentlich HTA?
        Wie wäre es mit Node.js?

        Naja Performance-Probleme sind ja von vornherein gegeben, da es sich um eine riesige Menge an Daten handelt.

        Nein ein Performance-Problem ist gegeben wenn die Skriptausführung für seine Aufgabenstellung unverhältnismäßig lange braucht oder Speicher frisst.

        1. Dein Problem ist die ausführende Umgebung. Warum eigentlich HTA?
          Wie wäre es mit Node.js?

          Kann ich das denn so ohne weiteres Starten lassen?
          Weil hab mal ne Test.js gemacht mit folgendem Inhalt:

          <script language="javascript" type="text/javascript">  
            
          	test();  
          	  
          	function test()  
          	{  
          		alert( "hallo" );  
          	};  
          	  
          </script>
          

          Da müsste er mir ja "Hallo" ausgeben oder?

          Oder ist an der Deklaration am Anfang was falsch? Denn dieses Test.js will ich nicht über mein eigentliches Script aufrufen wo Javascript definiert ist sondern halt einfach über den Autostart starten lassen.

          Nein ein Performance-Problem ist gegeben wenn die Skriptausführung für seine Aufgabenstellung unverhältnismäßig lange braucht oder Speicher frisst.

          Naja laut Taskmanager frisst es nicht all zu viel an Speicher. So an die 10% meiner CPU.

          Aber hab rausgefunden, wenn ich am Anfang ein window.close() reinschreibe, dann läuft er ohne diese Meldung einwandfrei durch.

          LG Romero

          1. Dein Problem ist die ausführende Umgebung. Warum eigentlich HTA?
            Wie wäre es mit Node.js?

            Kann ich das denn so ohne weiteres Starten lassen?

            Nein. Ich nehme an, dass du HTA benutzt, weil du gewisse Schnittstellen benötigst, die dir im Browser nicht zur Verfügung stehen, deswegen habe ich Node.js als alternative Umgebung vorgeschlagen. Node.js ist eine Server-Umgebung für Javascript, die APIs sind allerdings ganz andere als im Webbrowser. Von daher müsstest du deinen Code ggf. komplett neu schreiben, jenachdem wieviel Zeit schon investiert worden ist, ist das natürlich keine Option.

            1. Nein. Ich nehme an, dass du HTA benutzt, weil du gewisse Schnittstellen benötigst, die dir im Browser nicht zur Verfügung stehen, deswegen habe ich Node.js als alternative Umgebung vorgeschlagen. Node.js ist eine Server-Umgebung für Javascript, die APIs sind allerdings ganz andere als im Webbrowser. Von daher müsstest du deinen Code ggf. komplett neu schreiben, jenachdem wieviel Zeit schon investiert worden ist, ist das natürlich keine Option.

              Naja habe ja den bisherigen Script so umgeschrieben, weggelassen, kopiert, ... für das was ich halt brauche.

              Aber über den simplen Befehl window.close() wird halt das Fenster geschlossen und somit kommt keine dieser Meldungen hoch, sofern ich nix explizit deklariert habe.

              Und da umgehe ich sozusagen mein Problem, dass das IE zu langsam läuft.
              Ist vielleicht nicht die beste Lösung, weil das Script "beeinträchtigt" ja weiterhin den IE oder ggf. andere Programme beim Öffnen.

              LG Romero

              1. Und da umgehe ich sozusagen mein Problem, dass das IE zu langsam läuft.
                Ist vielleicht nicht die beste Lösung, weil das Script "beeinträchtigt" ja weiterhin den IE oder ggf. andere Programme beim Öffnen.

                Natürlich kommen keine Warnungen mehr, wenn du dein Programm einfach beendest. Wenn du damit als Lösung schon zufrieden bist, habe ich noch einen besseren Vorschlag: Das Programm garnicht erst starten ;P

                1. Natürlich kommen keine Warnungen mehr, wenn du dein Programm einfach beendest. Wenn du damit als Lösung schon zufrieden bist, habe ich noch einen besseren Vorschlag: Das Programm garnicht erst starten ;P

                  Haha :) du Spaßvogel du^^

                  Ne aber im Ernst, gibt es denn eine bessere Lösung dieses Problem zu beheben?

                  Diese Variante mit window.close() dient erstmal nur zu testzwecken, um zu schauen, wieviel Zeit überhaupt vergeht um die ganzen Indexe zu erstellen und ab wann ich diesen Script mittels Autostart erneut starten muss, damit er weiter die aktuellsten TXT's findet und abspeichert.

                  LG Romero

    2. Hi,

      Der IE10 unterstützt Websockets, also echtes Mulithreading für Javascript.

      Der IE10 unterstützt zwar WebSockets, diese haben aber nichts mit Multithreading zu tun.
      Was du vermutlich meinst sind WebWorkers. Auch die werden vom IE10 unterstützt.

      ~dave

      1. Der IE10 unterstützt zwar WebSockets, diese haben aber nichts mit Multithreading zu tun.
        Was du vermutlich meinst sind WebWorkers. Auch die werden vom IE10 unterstützt.

        Ark! Du hast natürlich recht! WebWorkers waren gemeint!

  2. Hallo romero,

    bei Langläufern benutze ich folgenden "Trick":

    ich lasse die Schleife nicht bis zum Ende laufen, sondern nur eine begrenzte Zeit, z.B. eine Sekunde. Wenn die Zeit um ist, die Aufgabe aber noch nicht erledigt, merke ich mir, wie weit ich gekommen bin und starte dann den nächsten Lauf per setTimeout mit 1 ms Verzögerung. So "friert" der Browser nicht ein und die Warnung kommt auch nicht.

    Ein weitere Vorteil dieser Methode ist, dass vom Script durchgeführte Änderungen an der Seite schon zur Laufzeit des Scriptes durchgeführt werden, und nicht erst am Ende.

    Siehe zum Beispiel meine Logistische Abbildung. Evtl. muss die Zahl der Iterationen deutlich größer gewählt werden, um den Effekt zu sehen. Die Logik steckt in der Funktion "plot_loop".

    Gruß, Jürgen

    1. ich lasse die Schleife nicht bis zum Ende laufen, sondern nur eine begrenzte Zeit, z.B. eine Sekunde. Wenn die Zeit um ist, die Aufgabe aber noch nicht erledigt, merke ich mir, wie weit ich gekommen bin und starte dann den nächsten Lauf per setTimeout mit 1 ms Verzögerung. So "friert" der Browser nicht ein und die Warnung kommt auch nicht.

      Interessantes Workaround. 1ms Verzögerung ist aber nicht machbar:

      "If the currently running task is a task that was created by the setTimeout() method, and timeout is less than 4, then increase timeout to 4." [whatwg]
      Die auszuführenden Segmente sollte also nicht zu klein gewählt werden, sonst erhöht sich die Laufzeit drastisch.

      1. Hallo 1UnitedPower,

        Interessantes Workaround. 1ms Verzögerung ist aber nicht machbar:

        da muss irgendein Wert stehen, ob die Zeit wirklich eingehalten wird, interessiert hier nicht. Wichtig ist nur, den Lauf kurz zu unterbrechen, damit der Browser zum Zug kommt und auf evtl. angefallene Nutzeraktionen reagieren kann.

        Gruß, Jürgen

        1. da muss irgendein Wert stehen, ob die Zeit wirklich eingehalten wird, interessiert hier nicht.

          Eben schon. romero sprach eben von 130.000 Dateien, wenn er jetzt die Bearbeitung einer Datei in einem Task ausführt, ergibt sich eine Laufzeitverlängerung von mindestens 130.000 * 0.004 s (~= 8.6 min). Und solche herben Verschelchterungen der Performanz sollten nicht verschwiegen werden.

          1. Hallo 1UnitedPower,

            da muss irgendein Wert stehen, ob die Zeit wirklich eingehalten wird, interessiert hier nicht.

            Eben schon. romero sprach eben von 130.000 Dateien, wenn er jetzt die Bearbeitung einer Datei in einem Task ausführt, ergibt sich eine Laufzeitverlängerung von mindestens 130.000 * 0.004 s (~= 8.6 min). Und solche herben Verschelchterungen der Performanz sollten nicht verschwiegen werden.

            du hast meinen Ansatz falsch verstanden. Die Aufteilung geht nicht nach Zahl der Schleifendurchläufe oder allgemeiner Zahl der Zwischenschritte, sondern nach der verstrichenen Zeit. Im vorgegeben Fall würde ich in einer while-Schleife eine Datei nach der anderen abarbeiten und nach jeder Datei prüfen, ob das Zeitlimit bzw. die letzte Datei erreicht ist. So ergibt sich ein Delay von z.B 4 ms auf eine Sekunde.

            Gruß, Jürgen

            1. du hast meinen Ansatz falsch verstanden.

              Hatte ich wirklich, danke für die Aufklärung.

              So ergibt sich ein Delay von z.B 4 ms auf eine Sekunde.

              Okay dafür gibts im worst-case dann aber auch ein Delay von einer Sekunde bei Benutzer-Interaktionen. Also es bleibt Abwägungssache.