15

我想知道由于超时时间太长,这段代码是否会给客户端带来负载?

        //and update this again in a bit
        setTimeout(function() {
            updateWeather(lat,lng);
        }, 60000);
4

4 回答 4

11

不仅仅是那个代码。系统空闲了那一分钟。只要 updateWeather 没有严重的性能问题并且间隔很短,setTimeout 就不会成为产品(我相信您的意思是 setInterval,而不是 setTimeout 用于重复检查)

于 2013-10-24T23:26:29.917 回答
4

60 秒计时器是在操作系统中通过魔术实现的:它在等待的 60 秒内基本上不会增加​​ CPU 负载。

我想updateWeather()是轮询外部资源,所以你的问题的答案是一个简单的“不,没关系”。(由于天气不会经常变化我会改为 5 分钟,请参阅下面关于电池寿命的评论。)(更好的是:看看天气数据提供商是否为您提供了一个字段,告诉您下一次更新的时间,并setTimeout在此基础上使用 a 。)

在其他情况下,例如,如果您在这 60 秒内一直在收集某种数据,然后一口气处理它,这可能会导致负载高峰。用户可能会注意到这一点(例如,所有动画每 60 秒跳一次)。在这种情况下,最好使用 5 秒计时器,一次处理 5 秒的数据。

相反,如果您在移动设备上使用网络,则必须考虑电池寿命:唤醒和查找连接可能占主导地位。因此,将轮询时间从 60 秒延长到 120 秒实际上可以使电池寿命翻倍。Ilya Grigorik 在他的《高性能浏览器网络》一书中有一个很好的章节,http ://shop.oreilly.com/product/0636920028048.do ...这里是:http://chimera.labs.oreilly。 com/books/1230000000545/ch08.html#ELIMINATE_POLLING

于 2013-10-24T23:48:54.627 回答
3

您的问题的答案取决于:

  1. 您执行此操作的设备
  2. 环境 - 你执行了多少次

独立的 setTimeout 不会伤害浏览器;但是,如果您重复做同样的事情,就会有所作为。

请查看以下网站以获取更多见解...

http://ejohn.org/blog/analyzing-timer-performance/

于 2013-10-24T23:25:45.733 回答
1

除了其他答案之外,要记住的一件事是范围内变量的关闭可能对内存性能产生的影响。如果回调上方范围内的变量引用了大量对象setTimeout,那么只要回调排队,这些对象就可能存在。这不是我们可以从您发布的代码中看出的东西,因此无法明确回答您的问题。此外,如果您setTimeout被多次调用,它将为每个创建一个闭包,从而有效地复制环境并占用您的堆空间。

于 2019-10-21T16:24:34.597 回答