ホームページ ウェブフロントエンド jsチュートリアル 実行速度を向上させるJavaScriptループ翻訳_JavaScriptスキル

実行速度を向上させるJavaScriptループ翻訳_JavaScriptスキル

May 16, 2016 pm 06:48 PM
サイクル 走行速度

この記事では最初の理由に焦点を当てます。最後に、従来のループ構造を置き換える開発モデルが提供され、スクリプトが制御不能になる状況を完全に回避できます。

原題: JavaScript の高速化、パート 1
原著者: Nicholas C . Zakas
前回の投稿 (翻訳) では、Internet Explorer であまりにも多くのステートメントが実行されると、各ブラウザーが制御不能なスクリプトをポップアップ表示する状況について説明しました。他のブラウザでは、スクリプトが一定期間以上実行され続けるとプロンプトが表示されます。私たちが議論したい中心的な問題は、これらのブラウザが暴走スクリプトをどのように検出するかではなく、これらの警告を回避するためにスクリプトの実行を高速化する方法です。
スクリプトが制御不能になる理由は基本的に 4 つあります。
ループ内で実行される操作が多すぎます。
関数本体の肥大化
再帰が多すぎます
DOM 呼び出しが多すぎます
この投稿では、1 つ目のループ内の操作が多すぎることに焦点を当てます。ループは同期して動作するため、ループの実行にかかる時間はループの数に完全に依存します。したがって、ループの実行時間が長すぎてブラウザがロックされる直接的な原因となる状況が 2 つあります。 1 つはループ本体に含まれる演算が多すぎること、もう 1 つはループの数が多すぎることです。これらの状況はいずれも、ブラウザがロックアップし、スクリプトが制御不能であることを示すメッセージを表示する直接的な原因となる可能性があります。
この問題を解決するコツは、次の 2 つの質問で各ループを評価することです:
このループは同期的に実行する必要がありますか?
ループ内のデータは順番に実行する必要がありますか?
両方の質問に対する答えが「いいえ」の場合は、ループ内の操作を分解することを選択できます。重要なのは、コードの特定のコンテキストに基づいて、上記の 2 つの質問に対する答えを判断することです。典型的なループは次のようになります。

コードをコピー コードは次のとおりです。

for ( var i=0; i < items.length; i ){
process(items[i]);
}

一見すると、特に問題はありません。このループが長時間実行されるかどうかは、ループの数によって決まります。ループの直後に、ループの結果に依存する必要がある他のコードがない場合、最初の質問に対する答えは「いいえ」です。また、ループでは一度に 1 つの値のみが処理され、前のループの結果に依存しないことがわかります。そのため、2 番目の質問に対する答えも「いいえ」です。これは、暴走したスクリプト メッセージでブラウザをロックしない方法でループを解消できることを意味します。
書籍『プロフェッショナル JavaScript 第 2 版』では、実行時間が非常に長いイリュージョンを処理するために次の方法をお勧めします:
コードをコピー コードは次のとおりです。

function chunk(array, process, context){
setTimeout(function(){
var item = array.shift ();
process.call(context, item);
if (array.length > 0){
setTimeout(arguments.callee, 100);
}
},
}

chunk() 関数の目的は、配列を小さな部分に分割して処理することです (これが名前の由来でもあります)。3 つのパラメーターを渡すことができます。処理される配列オブジェクト、処理関数、および process() 関数で対応するこのオブジェクトを設定するために使用されるオプションのコンテキスト変数。最初のタイマーは、操作間の遅延を処理するために使用されます (ここでは 100 ミリ秒に設定されていますが、実際のニーズに応じて変更できます)。この関数が実行されるたびに、配列内の最初のオブジェクトが取り出され、処理のために process() 関数に渡されます。この時点で process() にまだ未処理のオブジェクトがある場合は、Waiting を使用して別のタイマーが開始されます。繰り返し。上記のループでは、次のメソッドでこの関数を使用できます:
chunk(items, process);
ここでの配列はキューの形式をとり、ループ プロセス中に変更が発生することに注意してください。毎回。配列の元の状態を変更したい場合は、2 つの方法があります。1 つは、 concat() 関数を使用して、現在の配列を渡す前にそのコピーを作成する方法です。
chunk(items.concat(), process) );
もう 1 つのオプションは、chunk() 関数を直接変更し、関数内で直接変更することです:
コードをコピーします コードは次のとおりです:

function chunk(array, process, context){
var items = array.concat(); // 配列のクローンを作成します
setTimeout(function(){
var item = items.シフト();
process.call(context, item);
if (items.length > 0){
setTimeout(arguments.callee, 100); 100);
}


次のタイマーが有効になる前に配列の内容が変更される可能性があるため、この方法は単にインデックスを保存するよりも安全であることに注意してください。
ここで説明した chunk() 関数は、ループのパフォーマンスを最適化するための開始点にすぎません。必要に応じて、さらに機能を追加するために改良を続けることができます。たとえば、配列内のすべてのオブジェクトが処理された後、関数コールバックを追加できます。この方法で関数を変更するかどうかに関係なく、これは配列処理のパフォーマンスを最適化し、スクリプトが制御不能になっているという警告を回避するのに役立つ単なる JavaScript コード開発パターンです。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

ラムダ式がループから抜け出す ラムダ式がループから抜け出す Feb 20, 2024 am 08:47 AM

ラムダ式がループから抜け出すには、特定のコード例が必要です。プログラミングにおいて、ループ構造は頻繁に使用される重要な構文です。ただし、特定の状況では、現在のループ反復を終了するだけでなく、ループ本体内で特定の条件が満たされたときにループ全体から抜け出したい場合があります。このとき、ラムダ式の特性は、ループから抜け出すという目標を達成するのに役立ちます。ラムダ式は匿名関数を宣言する方法であり、内部的に単純な関数ロジックを定義できます。通常の関数宣言とは異なり、

Java 関数での再帰呼び出しの代替手段は何ですか? Java 関数での再帰呼び出しの代替手段は何ですか? May 05, 2024 am 10:42 AM

Java 関数における再帰呼び出しの反復による置き換え Java では、再帰はさまざまな問題を解決するために使用される強力なツールです。ただし、場合によっては、反復を使用する方が効率が高く、スタック オーバーフローが発生しにくいため、より良いオプションになる場合があります。反復の利点は次のとおりです。 再帰呼び出しごとに新しいスタック フレームを作成する必要がないため、より効率的です。スタック領域の使用量が制限されているため、スタック オーバーフローが発生する可能性は低くなります。再帰呼び出しの代替としての反復メソッド: Java には、再帰関数を反復関数に変換するメソッドがいくつかあります。 1. スタックを使用する スタックを使用するのが、再帰関数を反復関数に変換する最も簡単な方法です。スタックは、関数呼び出しスタックに似た、後入れ先出し (LIFO) データ構造です。パブリックインファ

Go言語におけるループと再帰の比較研究 Go言語におけるループと再帰の比較研究 Jun 01, 2023 am 09:23 AM

注: この記事では、Go 言語の観点からループと再帰を比較します。プログラムを作成するとき、一連のデータや操作を繰り返し処理する必要がある状況に遭遇することがよくあります。これを実現するには、ループまたは再帰を使用する必要があります。ループと再帰はどちらも一般的に使用される処理方法ですが、実際のアプリケーションではそれぞれにメリットとデメリットがあるため、実際の状況を考慮してどちらの方法を使用するかを選択する必要があります。この記事では、Go 言語におけるループと再帰の比較研究を行います。 1. ループ ループとは、特定のコードを繰り返し実行する仕組みです。 Go言語には主に3つのタイプがあります

なぜ C コードは Python よりも高速に実行されるのでしょうか? なぜ C コードは Python よりも高速に実行されるのでしょうか? Sep 11, 2023 pm 12:45 PM

この記事では、C コードが Python よりも高速に実行される理由を学びます。 Guido Van Rossum は、最も有名なプログラミング言語の 1 つである Python を開発しました。 Python は、初心者でもわかりやすい構文とシンプルなコードのため、開発者の間で人気があります。 Python を学ぶことは、プログラミングのキャリアを始めたばかりの人にとって非常に有益です。 Python プログラミング トレーニング、ブログ、ビデオ、モジュール、その他の何千ものリソースを使用して、この人気のある言語のあらゆる側面を学ぶことができます。完了すると、GUI 開発、Web デザイン、システム管理、複雑な金融取引や計算、データ サイエンス、視覚化などの最新の開発アクティビティを実行できるようになります。

PHPは配列内のすべての値を返して配列を形成します PHPは配列内のすべての値を返して配列を形成します Mar 21, 2024 am 09:06 AM

この記事では、PHP が配列のすべての値を返して配列を形成する方法について詳しく説明します。非常に実用的であると編集者が考えたので、参考として共有します。この記事を読んで何かを得ることができれば幸いです。 array_values() 関数の使用 array_values() 関数は、配列内のすべての値の配列を返します。元の配列のキーは保持されません。 $array=[&quot;foo&quot;=&gt;&quot;bar&quot;,&quot;baz&quot;=&gt;&quot;qux&quot;];$values=array_values($array);//$values は [&quot;bar&quot;,&quot;qux&quot;] になりますループを使用すると、配列のすべての値を手動で取得し、新しい値に追加できます。

Java Iterator と Iterable: エレガントなコードを書くためのステップ Java Iterator と Iterable: エレガントなコードを書くためのステップ Feb 19, 2024 pm 02:54 PM

Iterator インターフェイス Iterator インターフェイスは、コレクションを走査するために使用されるインターフェイスです。 hasNext()、next()、remove() などのいくつかのメソッドが提供されます。 hasNext() メソッドは、コレクション内に次の要素があるかどうかを示すブール値を返します。 next() メソッドは、コレクション内の次の要素を返し、それをコレクションから削除します。 Remove() メソッドは、コレクションから現在の要素を削除します。次のコード例は、Iterator インターフェイスを使用してコレクションを反復処理する方法を示しています。 Listnames=Arrays.asList("John","Mary","Bob");Iterator

win7の動作速度を向上させるための簡単なガイド win7の動作速度を向上させるための簡単なガイド Dec 26, 2023 pm 06:57 PM

win7 システムを使用していると、システムの動作が遅れたり、スムーズに動作しないと感じる場合がありますが、このとき、システムの詳細設定で最適化し、不要なアニメーションやサービスをオフにして、win7 の動作速度を向上させることができます。一緒に見てみましょう。最適化方法を見てみましょう。 Win7 実行速度最適化チュートリアル 1. まずコンピューターを見つけて「プロパティ」を開きます。 2. 「システムの詳細設定」を見つけます。 3. パフォーマンスの下の「設定」をクリックします。 4. 「カスタマイズ」にチェックを入れて不要なコンテンツのチェックを外すか、すべてのチェックを外します。 5. または、上記の「最高のパフォーマンスを実現するために調整する」にチェックを入れます

ベクトル化を使用して Python のループを置き換える ベクトル化を使用して Python のループを置き換える Apr 14, 2023 pm 07:07 PM

すべてのプログラミング言語はループから切り離せません。したがって、デフォルトでは、繰り返し操作があるたびにループの実行を開始します。しかし、多数の反復 (数百万行/数十億行) を扱う場合、ループの使用は犯罪です。数時間動けなくなって、後でそれがうまくいかないことに気づくかもしれません。ここで、Python でのベクトル化の実装が非常に重要になります。ベクトル化とは何ですか?ベクトル化は、データ セットに対する (NumPy) 配列操作を実装するための手法です。バックグラウンドで、配列または系列のすべての要素に操作を一度に適用します (一度に 1 行を操作する「for」ループとは異なります)。次に、いくつかのユースケースを使用して、ベクトル化とは何かを説明します。数値の合計を求めます##ループを使用します importtimestart

See all articles