2

プログラミングを学ぶための個人的なプロジェクトとして、サブネット計算機を構築しようとしています。私が問題を抱えている部分は、クラスフルなサブネット範囲を提示したいということです。たとえば、172.16.1.1/30 は 16384 のサブネットを提示

ます
... .0.11
...など

そのため、Web サイトに書き出すと、ブラウザが数秒間ロックされ、思ったよりも時間がかかります。できる限り調査したところ、「setTimeout」と入力すると、ロックアップに役立ち、ClassB サブネットを処理できることがわかりました (/32 で最大 65536)。ただし、数十万、数百万になると、まだ問題があります。数字をいじって、何が機能するかを確認するためのテスト スクリプトを作成しました。これに非常に慣れていないので、私はアイデアがありません。これが私のテストコードです...

HTML:

<!doctype html>
<html lang="en">
<head>
    <meta charset="utf-8">
    <title>My Page</title>

</head>
<body>
    <div id="subnetRange" style="border : solid 2px #ff0000; background : #000000; color : #ffffff; padding : 4px; width : 250px; height : 350px; overflow : auto; "></div>

    <script type="text/javascript" src="pump.js"></script>
</body>
</html>

ジャバスクリプト:

var i = 0;
var myArray = new Array();
document.getElementById('subnetRange').innerHTML = "Loading...";   //carry on pumping?

function doCalculation()
{

   //Surrounding loop to break the time out up by 1000 increments
   for ( var x = 0; x < 2000; x++) {
     myArray[i] = i;
     i = i + 1;
     var percent_complete=i;
   }

   return percent_complete;
}

function pump()
{
   var percent_complete=doCalculation();
   if (percent_complete<100000)
   {
      //pump();
      setTimeout(pump, 1);
   }
   if (percent_complete >= 100000) {
      document.getElementById('subnetRange').innerHTML = myArray.join("<br />");   //carry on pumping?
   }
}


//setTimeout(pump, 1);
pump();

役立つ情報を提供できれば幸いです。そうでない場合は、お尋ねください。できる限りの情報を提供します。

ありがとうございました

4

2 に答える 2

1

計算をdoCalculation2000のチャンクに分割していますが、配列の長さが100000になると、

document.getElementById('subnetRange').innerHTML = myArray.join("<br />");

それは間違った方法です。配列を埋めないのは大変な作業 (サブミリ秒で発生します) ですが、DOM 操作です。たとえば、次のように、それを分解する必要があります。

function pump() {
    var oldItemCount = myArray.length;
    var percent_complete = doCalculation();
    var newItems = myArray.slice(oldItemCount);
    document.getElementById('subnetRange').innerHTML += newItems.join("<br />");
    //                                               ^^^^^^^^^^^
    if (percent_complete < 100000) {
        setTimeout(pump, 1);
    }
}

(更新されたデモ)

上記のコードは問題を理解するためだけのものであることに注意してください。さらに改善することができます:newItemsの戻り値になる可能性がありdoCalculation、スライスは不要になります。また、innerHTML +=これを最適化できない古いブラウザーでは実際に速度が低下する可能性があります (DOM をシリアル化し、文字列の連結を行い、巨大な HTML 文字列を再度解析します)。DOM 要素の小さなチャンクを追加するためのより良い方法を見つける必要があるかもしれません。

于 2013-07-02T22:53:25.693 に答える
0

setTimeout にはミリ秒かかります... 1 から 25 または 35 のように増やしますか?

setTimeout(pump, 35);
于 2013-06-28T01:45:13.550 に答える