间隔循环中本地存储的最小 "acceptable" 延迟是多少(对于 "auto-saving")?
What is the minimum "acceptable" delay for a local storage in an interval loop (for "auto-saving")?
我正在开发具有自动保存功能的网络应用程序。
我使用类似的东西来管理备份:
setInterval(function(){
localStorage.setItem('save', data)
}, TIME_INTERVAL)
每次保存都会替换前一个。
你能告诉我 TIME_INTERVAL 的合理值吗?
我真的不知道对客户端的影响。我正在寻找技术答案,从用户的角度来看,永久保存对他来说是最好的,但如果需要,可以容忍延迟。
我什至用 TIME_INTERVAL = 1
做了一些测试,在我的浏览器上没有发现任何问题,但是每毫秒在客户端写入数据似乎很疯狂......你怎么看?我应该每秒保存一次数据还是这是一个非常糟糕的主意?
如果您将间隔设置得太短,客户端中的这些内容会受到影响:
- 电池寿命。 由于设备永远不会休眠,您会不断消耗电池(想想平板电脑、phone 或笔记本电脑 运行 电池)。如果 localStorage 存储在硬盘上,那么硬盘也不会掉电。
- CPU 争用。 您一直在使用 CPU,这可能会偶尔引起对 CPU 的一些争用(可能在这种情况是因为
localStorage.setItem()
相当快)。
- 存储使用。 由于 localStorage 是半永久性存储(断电后仍然存在),因此必须将其写入半永久性存储,这将是硬盘驱动器或闪存。如果您每隔几毫秒向此存储写入一次,它肯定会更快地耗尽该存储。
因此,由于所有这些在某些方面都是负面的,因此您不应将间隔时间设置得比实际需要的时间短。您会发现许多其他应用程序(例如 Whosebug 或 Google 文档)会在几分钟内执行一次自动保存,并且在基础数据实际更改之前它们不会执行另一次自动保存。
除非您有特别令人信服的案例要求比每隔几分钟更频繁地保存一次,否则我不明白为什么您应该比这更短。而且,如果您甚至 运行 在基础数据实际更改之前不设置计时器,那将真的非常有助于延长电池寿命。
想一想:刷新屏幕需要 16 毫秒(对于 60Hz 屏幕)(每帧 16 毫秒)。因此,对于您可能正在做的任何事情,1 毫秒听起来像是完全矫枉过正。
我有一招;也许它对你有用。
clearTimeout 和 setTimeout 的组合为您提供了世界上最好的。
我在客户端输入和存储之间设置了 500 毫秒(可以随意更改此数字)延迟。因此,一旦客户端停止输入 500 毫秒,它就会存储一个新值。每次加一个字母就存储一个文本是没有用的。
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<script>
var t; // timer object
$(document).ready(function() {
var my_textarea = $('#my_textarea');
my_textarea.on('input', function() {
backup(my_textarea.val());
})
});
function backup(data) {
var interval = 500;
// if a change was made, less than 500ms ago, we ignore the previous change, and execute the latest change.
clearTimeout(t);
t = setTimeout(function(){
localStorage.setItem('save', data)
}, interval);
}
</script>
<textarea id="my_textarea"></textarea>
顺便问一下,有人对此有意见吗?我已经在不同的情况下这样做了一段时间。
我正在开发具有自动保存功能的网络应用程序。 我使用类似的东西来管理备份:
setInterval(function(){
localStorage.setItem('save', data)
}, TIME_INTERVAL)
每次保存都会替换前一个。
你能告诉我 TIME_INTERVAL 的合理值吗?
我真的不知道对客户端的影响。我正在寻找技术答案,从用户的角度来看,永久保存对他来说是最好的,但如果需要,可以容忍延迟。
我什至用 TIME_INTERVAL = 1
做了一些测试,在我的浏览器上没有发现任何问题,但是每毫秒在客户端写入数据似乎很疯狂......你怎么看?我应该每秒保存一次数据还是这是一个非常糟糕的主意?
如果您将间隔设置得太短,客户端中的这些内容会受到影响:
- 电池寿命。 由于设备永远不会休眠,您会不断消耗电池(想想平板电脑、phone 或笔记本电脑 运行 电池)。如果 localStorage 存储在硬盘上,那么硬盘也不会掉电。
- CPU 争用。 您一直在使用 CPU,这可能会偶尔引起对 CPU 的一些争用(可能在这种情况是因为
localStorage.setItem()
相当快)。 - 存储使用。 由于 localStorage 是半永久性存储(断电后仍然存在),因此必须将其写入半永久性存储,这将是硬盘驱动器或闪存。如果您每隔几毫秒向此存储写入一次,它肯定会更快地耗尽该存储。
因此,由于所有这些在某些方面都是负面的,因此您不应将间隔时间设置得比实际需要的时间短。您会发现许多其他应用程序(例如 Whosebug 或 Google 文档)会在几分钟内执行一次自动保存,并且在基础数据实际更改之前它们不会执行另一次自动保存。
除非您有特别令人信服的案例要求比每隔几分钟更频繁地保存一次,否则我不明白为什么您应该比这更短。而且,如果您甚至 运行 在基础数据实际更改之前不设置计时器,那将真的非常有助于延长电池寿命。
想一想:刷新屏幕需要 16 毫秒(对于 60Hz 屏幕)(每帧 16 毫秒)。因此,对于您可能正在做的任何事情,1 毫秒听起来像是完全矫枉过正。
我有一招;也许它对你有用。 clearTimeout 和 setTimeout 的组合为您提供了世界上最好的。
我在客户端输入和存储之间设置了 500 毫秒(可以随意更改此数字)延迟。因此,一旦客户端停止输入 500 毫秒,它就会存储一个新值。每次加一个字母就存储一个文本是没有用的。
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<script>
var t; // timer object
$(document).ready(function() {
var my_textarea = $('#my_textarea');
my_textarea.on('input', function() {
backup(my_textarea.val());
})
});
function backup(data) {
var interval = 500;
// if a change was made, less than 500ms ago, we ignore the previous change, and execute the latest change.
clearTimeout(t);
t = setTimeout(function(){
localStorage.setItem('save', data)
}, interval);
}
</script>
<textarea id="my_textarea"></textarea>
顺便问一下,有人对此有意见吗?我已经在不同的情况下这样做了一段时间。