首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >批处理请求,以最大限度地减少细胞流失

批处理请求,以最大限度地减少细胞流失
EN

Stack Overflow用户
提问于 2013-09-20 05:06:58
回答 6查看 989关注 0票数 22

这篇文章最近登上了HackerNews的顶端:http://highscalability.com/blog/2013/9/18/if-youre-programming-a-cell-phone-like-a-server-youre-doing.html#

其中指出:

手机收音机是手机上最大的电池损耗之一。每次你发送数据时,不管多小,收音机都能打开20到30秒。你所做的每一个决定都应该以最小化无线电功率的次数为基础。通过改变应用程序处理数据传输的方式,电池寿命可以大大提高。用户现在想要他们的数据,诀窍是平衡用户体验与传输数据和最小化功耗。一个平衡是通过应用程序仔细地将所有重复和间歇的传输捆绑在一起,然后积极地预取间歇传输。

我想修改$.ajax以添加一个选项,比如“现在不需要执行,只需在启动另一个请求时执行此请求”。做这件事的好方法是什么?

我从这个开始:

代码语言:javascript
复制
(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无法检测单元格是否打开,那么为什么要麻烦呢?值得打扰吗?
EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2013-09-30 00:48:49

您所链接的这篇文章的重点是为应用程序优化功耗(是的,天气小部件的例子非常可怕)。根据定义,积极使用浏览器是一项前台任务;此外,还可以使用类似ApplicationCache的东西来减少对网络请求的需求。然后,您可以根据需要以编程方式更新缓存和避免DIY。

值得注意的是:如果您使用jQuery作为HTML5应用程序的一部分(可能是包装在Sencha或类似的应用程序中),那么移动应用框架可能更多地与请求优化有关,而不是代码本身。我没有任何证据,但该死的,这听起来是对的:)

  • 如何通过向方法中添加一个ajax选项来真正修改{batchable:true}方法?我也还没搞清楚。

这是一种非常有效的方法,但对我来说,这听起来像是鸭冲出错了。我不会。即使您正确地将batchable默认为false,我个人更愿意使用facade (甚至在它自己的名称空间中?)

代码语言:javascript
复制
var gQuery = {}; //gQuery = green jQuery, patent pending :)
gQuery.ajax = function(options,callback){
  //your own .ajax with blackjack and hooking timeouts, ultimately just calling
  $.ajax(options);
}

  • setInterval也总是保持手机的清醒吗?那是件坏事吗?有什么更好的办法不这样做吗?

setIntervalsetTimeout的本地实现非常相似;考虑到后者没有触发,而网站处于在线银行无活动提示的背景中;当页面不在前台时,它的执行就基本停止了。如果API可以用于这种“延迟”(本文提到了一些相关的iOS7功能),那么这可能是一种更好的方法,否则我认为没有理由避免setInterval

  • 这里还有其他东西会使电池流失得更快吗?

我推测任何重载都会(从计算pi到漂亮的3d转换)。但对我来说,这听起来是不成熟的优化,让我想起了一个电子阅读器,它的节电模式完全关闭了液晶屏幕:)

  • 这种做法是否值得呢?在一款现代智能手机中,同时发生的事情太多了,如果我的应用程序不使用手机,那么肯定还有其他的应用程序在使用。Javascript无法检测单元格是否打开,那么为什么要麻烦呢?值得打扰吗?

这篇文章指出,一款天气应用程序不合理地贪婪,这会让我担心。它似乎是一种开发监督,尽管它比其他任何事情都重要,比如在获取数据时比实际需要的更频繁。在理想的世界中,这应该在OS级别上得到很好的处理,否则您将得到一系列相互竞争的解决方案。IMO:在高可伸缩性发布另一篇文章告诉您:)之前,不要费心:)

票数 3
EN

Stack Overflow用户

发布于 2013-09-20 05:26:44

我在将选项添加到$.ajax方面取得了一些进展,开始编辑这个问题,并意识到它作为一个答案更好:

代码语言:javascript
复制
(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);

这其实相当简单。就是想看到更好的答案。

票数 7
EN

Stack Overflow用户

发布于 2013-09-30 02:24:22

  • setInterval也总是保持手机的清醒吗?那是件坏事吗?有什么更好的办法不这样做吗?

来自iPhone 4,iOS 6.1.0Safari环境:

A用倒计时计时器编写了一个应用程序,每隔一秒钟更新元素的文本.DOM树具有中等的复杂性。该应用程序是一个相对简单的计算器,没有任何AJAX。然而,我总是有一种隐秘的怀疑,即那些每秒一次的折返正在折磨着我。我的电池似乎很快耗尽,每当我离开它开着桌子,Safari在应用程序的网页上。

应用程序中只有两次超时。现在,我没有任何可以量化的证据证明超时耗尽了我的电池,但是从这个愚蠢的计算器中每45分钟损失10%是有点令人不安的。(谁知道呢,也许是背光。)

注意:您可能想要构建一个测试应用程序,它可以在间隔时间内执行AJAX,其他事情也可以间隔执行,并比较每个功能在类似条件下如何耗尽电池。获得一个受控的环境可能很棘手,但是如果排水系统有足够大的差异,那么即使是“不完美”的测试条件也会产生明显的结果

然而,我发现了iOS 6.1.0Safari如何处理超时的有趣之处:

  • 如果关闭屏幕,超时将不会运行回调。.
  • 的后果是,长期超时将“错过他们的标记”

如果我的应用程序的计时器是显示正确的时间(即使在我关闭并重新打开屏幕之后),那么我就不能走简单的路线并执行secondsLeft -= 1。如果我关闭屏幕,secondsLeft (相对于我的启动时间)就会“落后”,因此是不正确的。(当屏幕关闭时,setTimeout回调没有运行。)

解决办法是,我必须在每个间隔重新计算timeLeft = fortyMinutes - (new Date().getTime() - startTime)

此外,我的应用程序中的计时器应该从绿色到石灰、黄色、红色,因为它越来越接近到期。因为在这一点上,我担心我的间隔代码的效率,我怀疑最好是“安排”我的颜色变化的适当时间(石灰:开始时间后20分钟,黄色: 30分钟,红色: 35) (这似乎比四次不等-检查每一个间隔,这将是徒劳的99%的时间)。

然而,,如果我计划这样的颜色变化,而我的手机屏幕在目标时间被关闭,那么这种颜色改变就永远不会发生。

解决方案是在每个间隔上检查上次1秒计时器更新后所用的时间是否为">= 2秒“。(这样,应用程序就可以知道我的手机是否关闭了屏幕;它能够意识到它什么时候“落后”了。)在这一点上,如果必要的话,我会“强制”应用一个颜色变化,并安排下一个。

(不用说,我后来去掉了换色器.)

所以,我相信这证实了我的说法

如果屏幕关闭,iOS 6.1.0Safari不执行setTimeout回调函数.

因此,在“调度”AJAX调用时要记住这一点,因为您可能也会受到这种行为的影响。

用我的提议,我可以回答你的问题:

  • 至少对于iOS来说,我们知道当屏幕关闭时,setTimeout会睡觉。
  • 因此,setTimeout不会给你的手机做“噩梦”(“保持清醒”)。

  • 这种做法是否值得呢?在一款现代智能手机中,同时发生的事情太多了,如果我的应用程序不使用手机,那么肯定还有其他的应用程序在使用。Javascript无法检测单元格是否打开,那么为什么要麻烦呢?值得打扰吗?

如果您能够让这个实现正确地工作,那么它似乎是值得的。

您将为您提出的每个AJAX请求带来延迟,这将在一定程度上减缓您的应用程序。(毕竟,延迟是页面加载时间的祸害。)因此,您一定会通过“捆绑”请求获得一些好处。扩展$.ajax,使您可以“批处理”请求,肯定会有一些好处。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18909185

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档