パフォーマンスに深刻な影響を与える一般的なJavascriptの間違い?[閉まっている]


10

私が参加した最近のUI / UX MeetUpで、対話とUIにJavascript(jQuery)を使用するWebサイトにいくつかのフィードバックを与えました。これはかなり単純なアニメーションと操作でしたが、まともなコンピューターでのパフォーマンスはすごかったです。

実際、同じ問題で見た多くのサイトやプログラムを思い出しました。特定のアクションはパフォーマンスを完全に破壊します。これは、JavascriptがFlashの代替としてほとんど機能している(または、少なくとももっと目立つ)状況にあります。これは、はるかに多くのJavascriptと機能を備えているものの、非常にスムーズに実行する、私が使用した一部のWebアプリケーションとはまったく対照的です(IBMのCOGNOSは頭の中で考えられるものです)。

サイトのパフォーマンスを低下させるJSを開発する際に考慮されない一般的な問題をいくつか知りたいです。


他のすべてのプログラムと同じようです:必要以上に多くの作業を行い、同じ作業を何度も何度も繰り返します。

1
@delnanは本当ですが、JSのほうがはるかに普及しているようです。知覚かな?
Nic

1
JavaScriptについて語るとき、「サイト」について語るのは少しお粗末になりつつあります。それはどこにでもあり、最近ではすべてに使用されています。
アダムクロスランド2011

@Adam Crossland正解です。同じインスタンスで、jQueryに大きく依存しているネイティブアプリで開発者を支援したと思います。
Nic

1
あなたの質問に対する正確な答えではないので、私はそれをコメントにします:私はJavaScriptが多くのレンダリングを行う状況を経験しました、そして実際に秒を使い果たしたのはブラウザのレンダリングエンジンでした。したがって、パフォーマンスのボトルネックに対処するために、最初に不要なレンダリング操作を探します。
user281377

回答:


8

一般的なパフォーマンスキラーは.lengthforループ内でHTMLCollectionを呼び出すことです。

function foo(collection) {
    for (var index = 0; index < collection.length; index++) {
        // do something awesome here
    }
}

このアンチパターンにより、ループの各パスでコレクションのサイズが計算されます。より良い方法は、ループの外側の長さを計算することです:

function foo(collection) {
    var collectionLen = collection.length;
    for (var index = 0; index < collectionLen; index++) {
        // do something awesome here
    }
}

3
ブラウザによって異なります。このベンチマークを例にとると、FF 5では、「通常の」バージョンは「最適化された」バージョンとほぼ同時に実行されます。そして、本当に古くて汚いブラウザであっても、JSが実際に要素に興味のあることを行っていれば、このようなことはボトルネックにはなりません。

1
うーん!おそらく、今日の高度に最適化されたJITコンパイラーは、この知恵を少し時代遅れにしています。
アダムクロスランド2011

4
私はここでは本当の専門家ではありませんが、ECMA仕様から、長さは配列オブジェクトのプロパティにすぎないようです。したがって、それを呼び出すと、すべての要素を数えるのではなく、単に値を返します。すべての実装が仕様に準拠しているかどうかはわかりませんが、準拠している場合、コードはパフォーマンスをまったく向上させません。
Jacek Prucia、2011

4
@JacekPrucia彼は、配列ではなく、コレクションだと言った-通常、実際のコードでは、これはなどの関数によって返されるDOM要素のリストを意味します。この関数は、プロパティにアクセスするたびに長さを再計算するライブを返します。document.getElementsByTagNamenodeList.length
Yi Jiang、

2
@JacekPrucia ベンチマークはパフォーマンスの向上です。プロパティの検索は安くはありません。
レイノス2011

4

いいえ、問題はフラッシュの交換に使用されたJSに起因するものではありません。それが納得できない場合は、アクションスクリプトについてyourelfを文書化してください。JSに非常に近いです。

パフォーマンスキラーとして、いくつかの悪い習慣を見つけることができます。

  • スクロール、マウスの移動など、継続的なイベントにイベントハンドラーをアタッチします。これには2つの欠点があります。イベントが十分にトリガーされない場合、アプリケーションは反応しません。トリガーしすぎると、CPU負荷が非常に高くなります。
  • 同期AJAX呼び出しを行う。JavaScriptはマルチスレッド化されていないため、JSの一部が何かを待機していると、アプリケーションがフリーズします。非同期のAJAX呼び出しを使用する方が適切です。同じ方法でsetTimeout / setIntervalを使用して、長い計算フェーズを分割し、アプリケーションの反応を維持します。
  • 他の言語と同じようにアルゴリズムの複雑度が高い。

いくつかのアプリがフルブラウザの画像を回転、緩和、またはアニメーション化しようとして、その過程で惨めに失敗するのを見てきました。ここで、Flashの置換コメントは:)
Nic

AJAXの最初のAは非同期を表すので、技術的には同期であればAJAXではありませんが、あなたの主張は依然として良いものです。
カールビーレフェルト2011

はい、厳密にAJAXではありません。しかし、とにかく、これは避けなければなりません:D
deadalnix

3

インタラクションとUIにJavascript(jQuery)を使用するWebサイトにいくつかのフィードバックを与えました。これはかなり単純なアニメーションと操作でしたが、適切なコンピューターでのパフォーマンスは恐ろしかったです。

パフォーマンスに関する最大の問題の1つは、基礎となるDOMモデルとCSS3アニメーションモデル(またはキャンバス、またはsvg)を理解せずに高レベルの抽象化(jQueryなど)を使用することです。

あなたがいない場合は知っている抽象化せずにそれを行う方法を、あなたは絶対持っているゼロの技術が速いか遅いかの知識を。

JavaScriptを学ぶ、DOMを学ぶ。これらの2つを理解し、内部で抽象化が何を行うかがわかったら、それらを効率的に使用できます。もちろん、抽象化に気付くほとんどの時間は、ライブラリを使わずに手動で行うことです。


1

Javascriptの美しさと欠点は、非常に柔軟であることです。そうは言っても、実際には多くの場合に実行してはいけないことを実行することができます。

私が参加しているコードレビューから、主な懸念はCSSレンダリングに関連する傾向があります。新しいJS開発者にとって、グローバルスコープで使用されている変数が多すぎる傾向にあります。

また、不適切なクロージャはメモリリークを引き起こす可能性があります。ただし、最新のJavascriptフレームワークは、コードがフレームワークに従っている限り、この種の問題を防ぎます。


0

ここで私はより良いjqueryのコードを書くことについて1年ほど前に発見することを迅速リンクは次のとおりです。http://net.tutsplus.com/tutorials/javascript-ajax/10-ways-to-instantly-increase-your-jquery-performance /

パフォーマンスを低下させていた同僚のコードで見つけた1つのことは、キャッシュする必要のないデータをキャッシュすることでした。

例:

var table = $("#data").dataTable(.....);

DataTablesは、優れたグリッドを作成するために使用するjQueryプラグインです。とにかく、テーブルには5k行近くあり、DataTablesプラグインを適用してからテーブル変数に保存すると、実際にはFireFoxとIEの両方でスクリプトに時間がかかりすぎるという警告が表示されました。ストーリーのモラル。必要な場合にのみデータをキャッシュします。


1
DataTablesは、キャッシングの問題というよりも、実際には非効率的で貧弱なプラグインのように思えます。5kは何もありません。
レイノス

@Raynos:彼は5キロバイトのデータではなく5,000 を言った。「行」非常に大きなものになる可能性があります。
Chris Farmer

@ChrisFarmer「行」が非常に大きい場合、別の問題が発生します。
レイノス2011

-1

聞いたところによると、forループはjQueryのループよりも計算的に高速です$.each()


3
これは冗談の答えですか?
レイノス2011
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.