如何使用 dom.min_background_timeout_value 在 Firefox 中主动限制背景标签

Mic*_*eld 7 firefox cpu tabs throttling

在 Firefox 中积极节流后台标签的正确设置是什么?

几年前,我偶然发现了这篇文章,解释about:config了 Firefox 中用于限制背景(和前景)选项卡的各种设置,但我永远无法理解它们的含义。例如,尚不清楚这些选项中的每一个的单位是什么(秒、毫秒?),以及增加该值是否会增加或减少选项卡的限制。

dom.min_background_timeout_value
dom.timeout.background_budget_regeneration_rate
dom.timeout.background_throttling_max_budget
dom.timeout.budget_throttling_max_delay
dom.timeout.foreground_budget_regeneration_rate
dom.timeout.foreground_throttling_max_budget
dom.timeout.throttling_delay
Run Code Online (Sandbox Code Playgroud)

具体来说,让我们采取一个超级激进的节流策略:我想让后台选项卡每 30 分钟只被授予 1 毫秒的执行时间。我希望此策略在选项卡不再位于前台后 1 毫秒生效。也就是说,在我将标签留在后台后的 30 分钟内,标签的 CPU 使用率不应超过 0.00%。

这些 Firefox 设置的值应该是什么才能实现这种激进的节流行为?

Mic*_*eld 7

在我将标签页留在后台后的 30 分钟内,标签页的 CPU 使用率不应超过 0.00%。

这可以通过设置以下条目来实现 about:config

dom.min_background_timeout_value 1,800,000
dom.min_tracking_background_timeout_value 1,800,000
dom.timeout.throttling_delay 1
Run Code Online (Sandbox Code Playgroud)

根据关于 window.setTimeout 的 mozilla 文档“非活动选项卡”部分

为了减少后台选项卡的负载(和相关的电池使用量),超时被限制为在非活动选项卡中每秒触发一次(1,000 毫秒)。

Firefox 从版本 5 开始实现此行为(请参阅错误 633421,可以通过 dom.min_background_timeout_value 首选项调整 1000ms 常量)。Chrome 从版本 11 (crbug.com/66078) 开始实施此行为。

自 Firefox 14 中的错误 736602 起,Android 版 Firefox 为后台选项卡使用 15 分钟的超时值,并且后台选项卡也可以完全卸载。

所以dom.min_background_timeout_value在 firefox 上的默认值是 15 分钟(实际上设置900,000为单位是毫秒),这对于试图节省电池和稀缺 RAM/CPU 资源的设备来说是有意义的。将该值加倍以达到 30 分钟 = 1,800,000.

请注意,about:config节流跟踪脚本 ( dom.min_tracking_background_timeout_value)中有一个不同的条目,它也应该增加到与1,800,000ms相同的值。

默认情况下,当它们立即不再在前台时,选项卡不会淋污。因此,我们将ms设置dom.timeout.throttling_delay1一旦它们不再处于前台时几乎立即开始限制选项卡。

我不知道大多数其他about:config条目是做什么的。在budget那些特别混杂,并进一步澄清表示欢迎。

  • 这很有趣。我认为这应该放在偏好设置中,以便普通用户知道......比如选项“超级省电”、“中等”或“正常”。这将有助于延长笔记本电脑的电池寿命 (3认同)

小智 5

对于比简单的“大量限制所有计时器”更复杂的工作负载:即,如果计时器很短,则让计时器更频繁地运行,Firefox 中还有计时器预算机制。这种预算机制仅允许计时器在有“预算”的情况下运行,该“预算”会根据给定选项卡中计时器运行的时间量而减少,并根据缓慢的再生而增加。当它为负数时,计时器被阻止运行。请注意,计时器似乎是针对每个选项卡的:功能原理强烈暗示,对计时器“礼貌”的选项卡会受到奖励,而不会受到惩罚的选项卡。

about:config 中的以下选项可用于调整:

dom.timeout.background_budget_regeneration_rate降低计时器获得更多运行时间的速率。它以实时毫秒数为单位,在选项卡中后台选项卡计时器的预算增加一毫秒之前必须经过的时间。

dom.timeout.background_throttling_max_budget设置预算内可以存储的最大毫秒数。一旦预算如此之大,它就会停止增加。

dom.timeout.budget_throttling_max_delay设置给定选项卡中计时器可以强制等待的最大毫秒数。它凌驾于预算机制的其余部分之上。

因此,如果将genesis_rate设置为60,并将max_budget设置为3000,则该选项卡将在实时每分钟获得一秒的执行时间。如果这种情况下的 max_budget 设置为 3000,那么三分钟后预算将保留 3 秒的执行时间,并且将停止增加:因此六分钟后,它仍将保留 3 秒。假设 max_delay 设置为 1000(即预算最多只会让计时器停留一秒)。请注意,这些设置远非最佳。

如果上述选项卡中的计时器花费 5 秒执行(这不太可能),则预算将保持在 -2000 毫秒。如果该选项卡中的另一个计时器立即到期,则将被迫等待 2 分钟,同时预算重新生成正值。然而,由于 max_delay 太低(1 秒),因此在触发计时器之前只会经过 1 秒。

我不知道这如何与迈克尔描述的更传统的超时机制相互作用。有关该机制的更多详细信息,请参阅此邮件列表帖子。

  • 感谢您的补充解释!所有预算计时器都是针对每个选项卡的吗?如果没有,有什么方法可以按域设置这些预算吗?就像,我不希望合理的站点从不检查消息队列,只是因为 Facebook 正在咀嚼我的整个后台预算。 (3认同)