生成随机唯一数据的时间太长,占用了100%的CPU
Generating random unique data takes too long and eats 100% CPU
警告:CPU使用率将达到100%,请小心。
链接到jsFiddle
这个脚本是为了设计一个动态的蛇和梯子板而写的。每次刷新页面时,都会创建一个新的板。大多数时候,所有的背景图像都不会出现,CPU使用率高达100%。但有时它们都会出现,CPU使用情况正常。
Opera显示了一些背景图像,Firefox滞后并询问我是否希望停止脚本。
我认为问题出在这些代码行上:
for(var key in origin) // Need to implement check to ensure that two keys do not have the same VALUES!
{
if(origin[key] == random_1 || origin[key] == random_2 || key == random_2) // End points cannot be the same AND starting and end points cannot be the same.
{
valFlag = 1;
}
console.log(key);
}
您的算法非常无效。当数组几乎被填满时,您实际上会进行数百万次无用的迭代,直到您运气好,RNG意外地选择了丢失的数字。重写为:
- 生成一个包含所有可能数字(从1到99)的数组
- 当您需要一个随机数时,在该数组、拼接元素和该随机位置的当前边界中生成一个随机索引,将其从数组中删除,并将其值用作所需的随机数
- 若生成的数字不符合某些条件(minDiff?),则将它们返回到数组。请注意,如果数组中剩下的所有内容都不能满足您的条件,您仍然可以在循环中永远停滞
以这种方式从数组中提取的每个值都保证是唯一的,因为您最初用唯一的数字填充它,并在使用时删除它们。
我已经剥离了绘图,并将生成的数字放入数组中,您可以在控制台中进行检查。把你的图纸放回原处,它应该可以工作了——现在立即生成数字:
var snakes = ['./Images/Snakes/snake1.png','./Images/Snakes/snake2.jpg','./Images/Snakes/snake3.gif','./Images/Snakes/snake4.gif','./Images/Snakes/snake5.gif','./Images/Snakes/snake6.jpg'];
var ladders = ['./Images/Ladders/ladder1.jpg','./Images/Ladders/ladder2.jpg','./Images/Ladders/ladder3.png','./Images/Ladders/ladder4.jpg','./Images/Ladders/ladder5.png'];
function drawTable()
{
// Now generating snakes.
generateRand(snakes,0);
generateRand(ladders,1);
}
var uniqNumbers = []
for(var idx = 1; idx < 100; idx++){ uniqNumbers.push(idx) }
var results = []
function generateRand(arr,flag)
{
var valFlag = 0;
var minDiff = 8; // Minimum difference between start of snake/ladder to its end.
var temp;
for(var i = 0; i< arr.length; ++i) {
var valid = false
// This is the single place it still can hang, through with current size of arrays it is highly unlikely
do {
var random_1 = uniqNumbers.splice(Math.random() * uniqNumbers.length, 1)[0]
var random_2 = uniqNumbers.splice(Math.random() * uniqNumbers.length, 1)[0]
if (Math.abs(random_1 - random_2) < minDiff) {
// return numbers
uniqNumbers.push(random_1)
uniqNumbers.push(random_2)
} else {
valid = true
}
} while (!valid);
if(flag == 0) // Snake
{
if(random_1 < random_2) // Swapping them if the first number is smaller than the second number.
{
var temp = random_1; random_1 = random_2; random_2 = temp
}
}
else // Ladders
{
if(random_1>random_2) // Swapping them if the first number is greater than the second number.
{
var temp = random_1; random_1 = random_2; random_2 = temp
}
}
// Just for debug - look results up on console
results.push([random_1, random_2])
}
}
drawTable()
我在for循环中使用"HighCharts"时遇到了这样的问题——"浏览器"具有检测死脚本或无限循环的内置功能。因此,浏览器会暂停或弹出一条消息,说没有响应。不确定你是否有这种症状!
这是由一个包含大量数据的"循环"造成的。我在CodeProject上写了一个关于它的教程,你可以试试,它可能是你的答案。
http://www.codeproject.com/Tips/406739/Preventing-Stop-running-this-script-in-Browsers
相关文章:
- cpu:phantom:page的比例可以大于1:1:1吗
- Architecture for CPU intensive tasks with NodeJS & Socke
- 使用PHP来阻止用户下载代码,但代码占用cpu
- 有没有写100以上的索引的捷径
- 宽度为100%的CSS元素位于视口之外
- 如何在jQuery Mobile中设置100%宽度的输入类型日期
- 一旦总和达到100,就禁用其余的数字框
- Express.js应用程序最大CPU
- 100%的父图像.父级是固定位置的
- 普通JS:使80%宽度元素100%IF包含一个图像
- 如何使画布的宽度达到100%
- Web Worker 能否利用 100% 的多核 CPU
- 生成随机唯一数据的时间太长,占用了100%的CPU
- Galleria.io 和骨干网.js CPU 使用率 100%
- Jquery getScript(在 ajax 调用之后)使用 100% CPU
- 简单的拉斐尔.js动画,使用"animation.repeat"消耗100%的cpu
- 使用GetTimingInfo()导致100%的CPU
- JavaScript函数驱动CPU利用率到100%
- 建立WebSockets连接时CPU消耗100%
- Node.js 100% CPU - gettimeofday call