この記事は最近 HackerNews のトップに登場しました:http://highscalability.com/blog/2013/9/18/if-youre-programming-a-cell-phone-like-a-server-youre-doing.html#
そこにはこう記されている。
携帯電話の無線は、携帯電話のバッテリーを最も消耗させるものの 1 つです。データを送信するたびに、それがどんなに小さなデータであっても、無線は 20 ~ 30 秒間オンになります。すべての決定は、無線がオンになる回数を最小限に抑えることに基づいて行う必要があります。アプリがデータ転送を処理する方法を変更することで、バッテリー寿命を大幅に改善できます。ユーザーはデータをすぐに受け取りたいので、ユーザー エクスペリエンスとデータ転送のバランスを取り、電力消費を最小限に抑えることが重要です。アプリが繰り返し転送と断続転送をすべて慎重にまとめ、断続転送を積極的にプリフェッチすることで、バランスが実現されます。
$.ajax
「行う必要はありません」のようなオプションを追加するように変更したいと思います今すぐ「別のリクエストが開始されたときにこのリクエストを実行するだけです」。これを行う良い方法は何でしょうか?
私はこう始めました:
(function($) {
var batches = [];
var oldAjax = $.fn.ajax;
var lastAjax = 0;
var interval = 5*60*1000; // Should be between 2-5 minutes
$.fn.extend({batchedAjax: function() {
batches.push(arguments);
}});
var runBatches = function() {
var now = new Date().getTime();
var batched;
if (lastAjax + interval < now) {
while (batched = batches.pop()) {
oldAjax.apply(null, batched);
}
}
}
setInterval(runBatches, interval);
$.fn.ajax = function() {
runBatches();
oldAjax.apply(null, arguments);
lastAjax = now;
};
})(jQuery);
論文の文言からは分かりませんが、適切なバッチ「間隔」は 2 ~ 5 分だと思いますので、5 分を使用しました。
これは良い実装でしょうか?
ajax
メソッドにオプションを追加することで、メソッドのみを真に変更するにはどうすればよいでしょうか{batchable:true}
? 私もまだよくわかっていません。setInterval
携帯電話も常に起動したままになりますか? それは悪いことですか? そうしないより良い方法はあるでしょうか?バッテリーの消耗を早める原因となるものは他にもありますか?
このようなアプローチは価値があるのでしょうか?現代のスマートフォンでは同時に多くのことが起きており、私のアプリがセルを使用していないなら、他のアプリが使用しているはずです。Javascriptはセルがオンになっているかどうかを検出できないので、なぜわざわざ? わざわざやる価値はあるでしょうか?
ベストアンサー1
にオプションを追加する作業が進み$.ajax
、質問を編集し始めたところ、回答としては次の方が良いことに気付きました。
(function($) {
var batches = [];
var oldAjax = $.fn.ajax;
var lastAjax = 0;
var interval = 5*60*1000; // Should be between 2-5 minutes
var runBatches = function() {
var now = new Date().getTime();
var batched;
if (lastAjax + interval < now) {
while (batched = batches.pop()) {
oldAjax.apply(null, batched);
}
}
}
setInterval(runBatches, interval);
$.fn.ajax = function(url, options) {
if (options.batchable) {
batches.push(arguments);
return;
}
runBatches();
oldAjax.apply(null, arguments);
lastAjax = now;
};
})(jQuery);
それは実際かなり単純でした。しかし、もっと良い答えが見たいです。