innerHTML导致CPU长时间占用

function getScheculTable() {
var beginHour = 7;
var endHour = 22;
var timeInter = 30;
var howHalf = (endHour - beginHour)*2;
var srcTbl = document.getElementById("srcData");
d = new Date();
tmpd = new Date();
d.setHours(beginHour,timeInter);
var b,e;
var tbody = document.createElement("TBODY");
for(var i=1;i<howHalf;i++) {
d.setHours(beginHour,i*timeInter);
tmpd.setHours(beginHour,i*30+30);
b = (d.getHours()<10?"0"+d.getHours():d.getHours()) + ":" + (d.getMinutes()==0?"00":d.getMinutes());
e = (tmpd.getHours()<10?"0"+tmpd.getHours():tmpd.getHours()) + ":" + (tmpd.getMinutes()==0?"00":tmpd.getMinutes());
var row = document.createElement("TR");
var cell = document.createElement("TD");
cell.innerText = b+"-"+e;
cell.width = "25%"
row.appendChild(cell);
for(var n=0;n<5;n++) {
var cell = document.createElement("TD");
cell.width = "15%"
var div = document.createElement("DIV");
div.contentEditable = true;
div.style.width="100%";
cell.appendChild(div);
//cell.innerHTML = "<DIV CONTENTEDITABLE align=center STYLE='height: 100%; width: 100%;'>"
row.appendChild(cell);
}
tbody.appendChild(row);
}
srcTbl.appendChild(tbody);

}

见上面注释掉的一行cell.innerHTML = "<DIV CONTENTEDITABLE align=center STYLE='height: 100%; width: 100%;'>"
当我在BODY的onload里面掉用此方法时,发现电脑的CPU占用率居然直线上涨,最后才发现,原来当你对一个元素的innerHTML进行替换时,会占用大量的CPU时间,后来改用appendChild的方法,才使CPU降了下来,而前者CPU占用率是72%左右,后者的CPU占用率在30%左右
时间片轮转算法是一种常用的调度算法,它将CPU的使用时间划分为若干个时间片,每个时间片为一个固定的时间段,通常为10-100ms。当一个进程占用CPU时间达到一个时间片后,操作系统就会将其挂起,并让其他进程获得CPU的使用权,从而实现多进程并发执行。 以下是一个使用HTML和JavaScript实现时间片轮转算法的示例: HTML代码: ```html <!DOCTYPE html> <html> <head> <title>时间片轮转算法</title> </head> <body> <h1>时间片轮转算法</h1> <table id="processes"> <tr> <th>进程名</th> <th>到达时间</th> <th>执行时间</th> <th>剩余时间</th> <th>状态</th> <th>优先级</th> </tr> </table> <button onclick="start()">开始</button> <button onclick="stop()">停止</button> <button onclick="reset()">重置</button> <div id="chart"></div> </body> </html> ``` JavaScript代码: ```javascript // 定义进程类 class Process { constructor(name, arrivalTime, executionTime, priority) { this.name = name; // 进程名 this.arrivalTime = arrivalTime; // 到达时间 this.executionTime = executionTime; // 执行时间 this.remainingTime = executionTime; // 剩余时间 this.state = '未执行'; // 状态 this.priority = priority; // 优先级 } } let processes = []; // 进程列表 let timeQuantum = 50; // 时间片长度 let timerId; // 定时器ID // 添加进程 function addProcess() { let name = prompt('请输入进程名'); let arrivalTime = parseInt(prompt('请输入到达时间')); let executionTime = parseInt(prompt('请输入执行时间')); let priority = parseInt(prompt('请输入优先级')); let process = new Process(name, arrivalTime, executionTime, priority); processes.push(process); refreshTable(); } // 刷新进程列表 function refreshTable() { let table = document.getElementById('processes'); // 先清空表格内容 while (table.rows.length > 1) { table.deleteRow(1); } // 添加新的进程信息 for (let i = 0; i < processes.length; i++) { let row = table.insertRow(); row.insertCell().innerHTML = processes[i].name; row.insertCell().innerHTML = processes[i].arrivalTime; row.insertCell().innerHTML = processes[i].executionTime; row.insertCell().innerHTML = processes[i].remainingTime; row.insertCell().innerHTML = processes[i].state; row.insertCell().innerHTML = processes[i].priority; } } // 执行进程 function runProcess(process) { // 更新进程状态和剩余时间 process.state = '执行中'; process.remainingTime -= timeQuantum; refreshTable(); // 模拟时间片轮转 setTimeout(() => { // 如果进程已经执行完毕,则更新状态为已完成 if (process.remainingTime <= 0) { process.state = '已完成'; } // 否则更新状态为已挂起,将进程加入队列末尾 else { process.state = '已挂起'; processes.push(processes.shift()); } refreshTable(); // 如果还有进程未执行完毕,则继续轮转 let unfinishedProcesses = processes.filter(process => process.remainingTime > 0); if (unfinishedProcesses.length > 0) { runProcess(unfinishedProcesses[0]); } // 否则停止定时器 else { clearInterval(timerId); timerId = undefined; } }, timeQuantum); } // 开始执行进程 function start() { // 如果已经有定时器在运行,则返回 if (timerId) { return; } // 按到达时间排序 processes.sort((p1, p2) => p1.arrivalTime - p2.arrivalTime); // 启动定时器 timerId = setInterval(() => { // 找到第一个未执行的进程 let process = processes.find(process => process.state === '未执行'); // 如果没有未执行的进程,则返回 if (!process) { return; } // 执行进程 runProcess(process); }, timeQuantum); } // 停止执行进程 function stop() { clearInterval(timerId); timerId = undefined; } // 重置进程列表 function reset() { processes = []; refreshTable(); } ``` 在这个示例中,我们定义了一个`Process`类来表示进程,包含了进程的基本属性(进程名、到达时间、执行时间、剩余时间、状态和优先级)。我们还定义了一些函数来添加、刷新、执行、停止和重置进程列表。最后,在HTML页面中,我们添加了一个表格来显示进程信息,以及一些按钮来启动、停止和重置时间片轮转算法的执行。我们还使用了`setTimeout`函数来模拟时间片轮转算法的执行过程,并使用`setInterval`函数来控制时间片轮转算法的整个执行过程。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值