【问题标题】:Big variables in JavaScript - make them global?JavaScript 中的大变量 - 使它们成为全局变量?
【发布时间】:2014-10-22 16:41:43
【问题描述】:

在一个用 Cordova 制作的相当大的应用程序中,我们不断地从用户的 LocalStorage 中获取一组变量。我的意思是,这个集合相当大(可以从一些 kbytes 到相当 10mb)。我很确定将变量加载到内存中可能不是一个好主意(尤其是在低功耗、低内存设备中),但事实证明从 LocalStorage 中获取它们似乎花费了太长时间。此刻,我们的做法是这样的:

function doSomething() {
    var ourData = JSON.parse(localStorage.getItem('ourData'));

    ourData = processingBackAndForth(ourData);

    localStorage.setItem('ourData', JSON.stringify(ourData));

    syncWithServer(ourData);
}

processingBackAndForth(ourData) 非常密集,整个函数几乎每 10 秒使用一次。现在,我在想,这应该更快吗?

ourData = JSON.parse(localStorage.getItem('ourData'));

function doSomething() {
    ourData = processingBackAndForth(ourData);

    localStorage.setItem('ourData', JSON.stringify(ourData));
    syncWithServer(ourData);
}

看了一点on this之后,嗯,它基本上告诉我们最好将它们保持在本地范围内(我知道这对封装更好),但是这个过程是不是有点太多了?想象一下,从 LocalStorage 中检索,再次保存,然后让 GC 清理变量,之后将再次使用它。

我知道声明链接的要点之一是,如果需要在整个应用程序中使用某些东西,并且仅在非常特殊的情况下,那么将其设为全局,但无论如何,例如在服务器和 LocalStorage 之间保持同步版本还是很关心我,所以实际上我只是减轻了检索和垃圾收集的重量。

JavaScript 代码是否会使用大的全局变量而不是大的局部变量来获得一些微优化?

【问题讨论】:

  • 听起来您要么需要将数据分成更小的块,要么使用数据库。
  • 本地 sqlite 数据库是更好的选择
  • 数据实际上是不稳定的,因为它只会持续到应用程序关闭。之后我仍然需要从头开始刷新它。我设法通过将 LocalStorage 的访问减少一半并尽可能多地存储解析的数据来解决这个问题(仅在需要时对其进行字符串化,因为它是一个主要瓶颈)。不过感谢您的帮助!

标签: javascript cordova optimization global-variables local-storage


【解决方案1】:

您说您的数据可能非常大(最多 10MB)。现在的问题是:只检索一次数据并在全球范围内保存会更好吗?

就性能而言,如果您多次获取或设置数据,这将真正减慢您的程序,因此您的目标是尽可能少地请求和设置数据,以便您不必每次都等待localStorage 检索它。

现在,鉴于您的功能:

ourData = JSON.parse(localStorage.getItem('ourData'));

function doSomething() {
    ourData = processingBackAndForth(ourData);

    localStorage.setItem('ourData', JSON.stringify(ourData));
    syncWithServer(ourData);
}

上面的代码是如果你多次调用doSomething()函数是最好的解决方案,因为数据只检索一次,然后可以根据需要进行多次阐述,并保存再次。当您使用完您的数据后,您应该删除它 (delete ourData;)。

否则,如果您只调用一次doSomething() 函数,那么最好的解决方案是在函数本身中获取数据,因为它只会与函数一样存在运行,一旦函数结束,它将自动从内存中删除,所以最好的方法是:

function doSomething() {
    var ourData = JSON.parse(localStorage.getItem('ourData'));
    ourData = processingBackAndForth(ourData);

    localStorage.setItem('ourData', JSON.stringify(ourData));
    syncWithServer(ourData);
}

TL;DR您有两个选择:

  1. 如果你多次使用doSomething()函数,最好全局保存数据,完成后再删除。
  2. 如果您只使用一次doSomething() 函数,那么最好使用var 关键字检索函数内部的数据。

【讨论】:

  • 好吧,你以某种方式重新表述了我的问题并添加了一些细节,但我遵循了我自己/你的建议,所以我想这个是给你的
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-01-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多