3

私は最近、Project Euler の問題をいじり始め、Javascript で解決しようとしています。これを行うと、多くの無限ループが発生する傾向があります.FirefoxまたはChromeでタブを強制終了するよりも、スクリプトを終了するより良い方法があるかどうか疑問に思っています.

また、firebug は依然として「最高の」デバッガーと見なされています (私自身、firebug と safari/chrome の Web 開発ツールの間に大きな違いは見られません)。

ではでは、素敵な日曜日を!

4

3 に答える 3

1

Firebug は今でも私の個人的な選択ツールです。

あなたの無限ループを殺す方法について。一部のブラウザでは、これが完全に起こらないようにします。ただし、私はまだctrl+wに行くことを好みますが、それでもタブを閉じます。

あなたが調べることができる他の選択肢のいくつか:

オペラ:トンボ

Safari / Chrome : Web インスペクター

とはいえ、Opera には非常に便利な開発者ツールのセットがあります。(ツール -> 詳細設定 -> 開発者ツール)

于 2010-09-19T08:13:54.303 に答える
0

FirebugまたはWebkitデバッガーがあることは素晴らしいことですが、それ以外の点では、ブラウザーはProjectEulerのもののオーバーヘッドのように見えます。RhinoV8のようなランタイムを使ってみませんか?

于 2010-09-19T09:04:56.703 に答える
0

明示的に終了するコードを挿入したくない場合は、条件付きブレークポイントを使用してみてください。Firebug のスクリプト コンソールを開き、コードの横のガターを右クリックすると、ブレークポイントが挿入され、ブレークポイントが何らかの条件を満たしていることをトリガーするオプションが提供されます。たとえば、コードが次の場合:

var intMaxIterations = 10000;
var go = function() {
    while(intMaxInterations > 0) {
        /*DO SOMETHING*/
        intMaxIterations--;
    }
};

... ループの 10,000 回の繰り返しがすべて終了するのを待つか、条件付きブレークポイントをループ内のどこかに配置して condition を指定することができますintMaxIterations < 9000。これにより、ループ内のコードを 1000 回 (実際には 1001 回) 実行できます。その時点で、必要に応じてページを更新できます。

しかし、スクリプトが (間違いまたは設計によって) エンドレス ループに入ってしまうと、準備ができていない場合、それを止めるためにできることはあまりありません。そのため、頻繁に再帰的なことを行うときは、通常、特定のコード ブロックを実行できる回数に制限を設けます。これを行う方法はたくさんあります。動作が実際のエラーであると考える場合は、スローすることを検討してください。例えば

var intMaxIterations = 10000;
var go = function() {
    while(true) {
        /*DO SOMETHING*/
        intMaxIterations--;

        if (intMaxIterations < 0) {
            throw "Too many iterations. Halting";
        }
    }
};

編集: このスクリプトを使用しているのはあなただけなので、Web ワーカーが理想的なソリューションであることがわかりました。

あなたが見ている基本的な問題は、JS が無限ループに入ると、ブラウザーをブロックし、実行を停止するために通常使用するイベントに応答しなくなることです。Web ワーカーは同じように高速ですが、ブラウザに負荷がかからず、イベントが正常に発生します。これは、要求の高いタスク (この場合はオイラー問題アルゴリズム) を Web ワーカー JS ファイルに渡すという考え方です。Web ワーカー JS ファイルは独自のスレッドで実行され、メイン ブラウザーで必要とされない場合にのみ CPU リソースを消費します。最終的な結果として、CPU は現在と同じように急上昇しますが、ブラウザーは高速で応答性を維持します。

初めて Web Worker を設定するのは少し面倒ですが、この場合は 1 回だけで済みます。アルゴリズムが戻らない場合は、ボタンを押してワーカー スレッドを強制終了してください。詳細については、MDC でのWeb ワーカーの使用を参照してください。

于 2010-09-19T08:52:40.733 に答える