我正在处理一个非常时间紧迫的应用程序,它使用按键作为用户输入。因为毫秒级别的问题很重要,所以我尝试了以下版本:
function start() {
//stim.style.display = "block";
rt_start = new Date().getTime();
response_allowed = 1;
}
function end() {
var t = rt_end - rt_start;
//stim.style.display = "none";
log.innerHTML = t;
i++;
if (i < iterations) {
setTimeout('start();', 1000);
}
}
var rt_start;
var rt_end;
var iterations = 100;
var i = 0;
var response_allowed = 0;
var stim;
var log;
$(document).ready(function() {
document.onkeydown = function(e) {
if (response_allowed == 1) {
rt_end = new Date().getTime();
response_allowed = 0;
end();
}
};
stim = document.getElementById('stim');
log = document.getElementById('log');
start();
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<div id="log"></div>
<img src="https://www.gravatar.com/avatar/cfefd93404e6b0eb3cde02b4b6df4e2b?s=128&d=identicon&r=PG&f=1" id="stim" />
这段代码在普通情况下运行良好,计时器通常不到5ms(只需按住一个键即可)。但一旦我修改代码以显示图像(取消注释两行),它的速度就会大大降低,约为30ms。
有人能告诉我为什么会出现这种情况以及如何可能避免这种额外的延迟吗?
谢谢
setTimeout
/setInterval
,而且有几个原因不这样做。相反,传递要调用的函数的引用:setTimeout(start, 1000);
- T.J. CrowdersetTimeout
在jsFiddle上运行良好(http://jsfiddle.net/gcvtaxfm/),但我已经将您的代码更新为Stack Snippet(我使用了您的gravatar而不是test.png
)。 - T.J. Crowder