在Cordova制作的一个相当大的应用程序中,我们不断地从用户的LocalStorage中获取一组变量。我的意思是,这个集很大(可以从几千字节到相当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代码是否会使用大的全局变量而不是大的局部变量来获得一些微优化?
答案 0 :(得分:0)
您说您的数据可能非常大(最多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 你有两个选择:
doSomething()
函数 ,最好全局保存数据,然后在完成时将其删除。doSomething()
关键字检索函数内的数据。