1

私は非常にパフォーマンスに制約のあるデバイスに取り組んでいます。AJAX リクエストのオーバーヘッドのため、テキストと画像のアセットをブラウザに積極的にキャッシュするつもりですが、デバイスごとのキャッシュ サイズをテキストと画像のサイズと同じくらい小さく設定する必要があり1MBます9MB。画面、グラフィカル アプリケーション。

デバイスは簡単にメモリ制限に達するため、アプリケーションのサイズを管理する方法について非常に注意する必要があります: コード ファイルのサイズ、同時 HTTP リクエストの数、イベント ディスパッチ時の JS プロセッサ サイクルの数、CSS リフローの制限など。テキスト アセットと画像用にサイズが制限されたキャッシュを開発する方法です。

テキストについては、 for オブジェクトを使用して独自のキャッシュをロールし、サイズを概算しました。アプリケーションは手動でキャッシュ エントリを取得/設定します。構成可能な上限に達すると、クラスのガベージ コレクションは からまでのサイズで行われ、最後にアクセスされたプロパティに重みが付けられます (つまり、何かが最近アクセスされた場合、そのオブジェクトの最初の収集はスキップされます)。JSON.encode().length'string'.lengthgcLimitgcTarget

Image()画像については、インターフェイス要素をプリロードし、DOM 要素を削除してオブジェクトを永続的に保存しないことで、ブラウザーがガベージ コレクション自体を処理できるようにするつもりです。プリロードについては、おそらくもう一度自分でロールバックします-FiNGAHOLiC の ImgPreloader とthisのように模倣する例があります。「ダウンロード ウィンドウ サイズ」や「最大キャッシュ リクエスト数」などの機能を念頭に置いて、デバイスが過負荷にならないようにする必要があります。

これは、このような制約のある環境で作業する大きな課題であり、Backbone などの一般的なフレームワークは「最大コレクション サイズ」をサポートしていません。SO の他の場所では、ユーザー5MBは HTML5 localStorage の制限を引用していますが、私の目標はセッションの永続性ではないため、その利点はわかりません。

もっと良い解決策があるかもしれないと感じずにはいられません。アイデア?

編集:@ Xotic750:IndexedDBにうなずいてくれてありがとう。残念ながら、このアプリは Opera/Presto 上に構築された標準の Web ページです。さらに良いことに、このプラットフォームは持続性を提供しません。ロックとハードプレイス :-/。

4

2 に答える 2

1

アプリケーションがブラウザ拡張機能である場合 (アプリケーションが何であるかについて言及していない場合)、localStorage および sessionStorage ( DOM Storage ) の制限は適用されません (またはオーバーライドできます)。

localStorage は永続的です

sessionStorage はセッションです

考え

IndexedDBを見てください。まだ広くサポートされていませんが、はるかに柔軟です。

また、Chrome ストレージへの参照

HTML5 オフライン ストレージの管理

chrome.storage

于 2013-05-17T00:04:44.960 に答える
0

最新の JavaScript エンジンを使用すると、ほとんどのアプリ (ゲーム、重いアニメーション、またはフラッシュを除く) の CPU/GPU パフォーマンスは、低電力デバイスでも問題にならないため、主な問題はメモリと io であると思われます。通常、一方を最適化すると他方が害を受けますが、以下の問題が主な関心事になると思います。

ブラウザのキャッシュの使用を制御できるかどうかはわかりません。あなたが提案したような方法を使用して、JavaScriptアプリが使用するメモリを制限できますが、ブラウザは独自のことを行い、おそらくメモリの面で主な問題です. 独自のキャッシュを作成すると、ブラウザによって既にキャッシュされているデータが実際に複製され、メモリの問題が悪化する可能性があります。ブラウザは (あいまいなものを使用していない限り)、通常、javascript よりも優れたキャッシュ機能を実行します。いずれにせよ、ブラウザにガベージ コレクションを処理させることを強くお勧めします。なぜなら、JavaScript では実際にブラウザに強制的にメモリを解放させる方法がないからです (ガベージ コレクションは、ユーザーが指示したときではなく、必要なときに行います)。デバイスで使用するブラウザを制御できますか? もしそうなら、それを変更することがメモリ使用量を減らす最善の方法かもしれません (また、ブラウザのキャッシュのサイズを制限できますか?)。

ajax リクエストの場合、GET と POST の違いを完全に理解してください。これは、ブラウザーでのキャッシュと、Web でメッセージをルーティングするプロキシでのキャッシュに大きな影響を与えるためです (したがって、アプリのロジックにも影響します)。リクエストをグループ化することで、リクエストの数を最小限にできるかどうかを確認してください (ここでは JSON が役立ちます)。通常、AJAX リクエストの問題は帯域幅ではなくレイテンシーです (ただし、ほとんどのブラウザーは複数のリクエストを同時に実行できるため、行き過ぎないようにしてください)。リクエストの優先順位付けを許可するように ajax マネージャーを構築してください (つまり、ユーザーが見るものに影響を与えるものは、分析よりも優先されるプリロードよりも優先されます - Web の半分には、ページの読み込み後、広告の前であっても最初に行われる Google 分析呼び出しがあります)および他のコンテンツがロードされます)。

それを超えて、画像がメモリの問題の主な原因である可能性が高いことをお勧めします(コードサイズが登録されているかどうかは疑問ですが、Googleクロージャーなどでコードが最小化されていることを確認する必要があります). 画像の解像度を最小限まで下げて、ファイル形式を試してみてください (たとえば、gif や png は、一部の画像 (漫画、ロゴ、アイコン) では jpeg よりも大幅に小さい場合がありますが、他の画像 (写真、グラデーション) でははるかに大きい場合があります)。

アプリの 10MB のキャッシュは小さいように聞こえるかもしれませんが、実際には、世の中にあるほとんどのアプリと比較すると膨大です。大多数はキャッシュをブラウザーに任せます (いずれにしても、必要かどうかに関係なく、おそらくデータはキャッシュされます)。

キャンバスを使用していることを示唆する Image オブジェクトについて言及しています。画像を保存する新しいキャンバスを作成すると、速度が大幅に向上します (その後、Image オブジェクトを破棄できます)。このキャンバスは、後でキャンバスにコピーする必要がある画像データのソースとして使用できます。データ型間の変換が必要ないため、はるかに高速です。キャンバス操作が 1 フレームで何度も発生することが多いことを考えると、これは大幅な後押しになる可能性があります。

最後の注意 - デスクトップ環境を念頭に置いて開発されたフレームワーク/ライブラリを使用しないでください。パフォーマンス (速度またはメモリ) を最適化するには、コードのすべての行を理解する必要があります。ライブラリのソース コードを見てください (多くのライブラリには非常に巧妙に最適化されたコードがあります)。

于 2013-05-17T00:19:36.240 に答える