<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>前端性能测试</title> </head> <body> <div><button onclick="alert(` 1. 运算测试,计算十亿次浮点数相加和相乘,统计时间; 2. 连续内存读写测试,创建长度为十万的数组,进行一百万次随机位置读写,统计时间; 3. 随机排序测试,创建长度为一万的数组,进行随机排序100次,统计时间; 4. Dom性能测试,重复执行一千次浏览器节点插入和计算尺寸,统计时间; 5. Canvas性能测试,在画布上进行1600次矩形绘制,统计时间; 6. Webgl支持测试,测试浏览器是否支持webgl; 7. GPU测试,使用显卡渲染3000个三角面,时长4秒,统计平均帧率;`)">测试内容说明</button></div> <div id="title"> <button onclick="start()">开始测试</button> </div> <div id="result"></div> <div id="renderArea"> <div></div> </div> <script> const title = document.getElementById('title') const result = document.getElementById('result') const renderArea = document.getElementById('renderArea') const items = 7 async function start() { result.innerHTML = '' title.innerText = `正在进行运算测试(1/${items})` await sleep() testcalc() title.innerText = `正在进行内存读写测试(2/${items})` await sleep() testMemory(); title.innerText = `正在进行随机排序测试(3/${items})` await sleep() testSort(); title.innerText = `正在进行DOM性能测试(4/${items})` await sleep() testDom() await sleep() renderArea.innerHTML = '' title.innerText = `正在进行Canvas性能测试(5/${items})` await sleep() await testCanvas() await sleep() renderArea.innerHTML = '' title.innerText = `正在进行Webgl检查测试(6/${items})` await sleep() const canvas = document.createElement('canvas') if (canvas.getContext('webgl') || canvas.getContext('experimental-webgl')) { const p = document.createElement('p') p.innerText = `Webgl测试结果:支持` result.appendChild(p) await sleep() title.innerText = `正在进行GPU性能测试,约4秒(7/${items})` await sleep() await testGpu() } else { const p = document.createElement('p') p.innerText = `Webgl测试结果:不支持, 无法进行显卡测试` result.appendChild(p) title.innerText = '测试完毕,结果如下' renderArea.innerHTML = '' } } function sleep(time) { return new Promise((resolve) => { setTimeout(() => { resolve() }, time || 500); }) } function testcalc() { const start = new Date().valueOf(); let sum = 0; for (let i = 0; i < 1000; i += 0.01) { for (let j = 0; j < 100; j += 0.01) { sum = i + j; } } let mul = 0; for (let i = 0; i < 1000; i += 0.01) { for (let j = 0; j < 100; j += 0.01) { mul = i * j; } } const end = new Date().valueOf(); const p = document.createElement('p') p.innerText = `运算测试结果:${end - start}ms` result.appendChild(p) } function testMemory() { const start = new Date().valueOf(); const arr = new Array(100000).fill(0).map(() => Math.random().toString(16).slice(2, 10)); let str = '' for (let i = 0; i < 1000000; i++) { const index = Math.floor((Math.random() * 100000)) str = arr[index] } const end = new Date().valueOf(); const p = document.createElement('p') p.innerText = `内存读写测试结果:${end - start}ms` result.appendChild(p) } function testSort() { const start = new Date().valueOf(); const arr = new Array(10000).fill(0).map(() => Math.random() * 10000); for (let i = 0; i < 100; i++) { arr.sort(() => Math.random() - 0.5) } const end = new Date().valueOf(); const p = document.createElement('p') p.innerText = `随机排序测试结果:${end - start}ms` result.appendChild(p) } function testDom() { const start = new Date().valueOf(); let height = 0; for (let i = 0; i < 1000; i++) { const div = document.createElement('div') div.style.height = '1px' div.style.backgroundColor = `#${Math.random().toString(16).slice(2, 8)}` renderArea.appendChild(div) height = renderArea.offsetHeight } const end = new Date().valueOf(); const p = document.createElement('p') p.innerText = `DOM性能测试结果:${end - start}ms` result.appendChild(p) } async function testCanvas() { const start = new Date().valueOf(); renderArea.innerHTML = '' const canvas = document.createElement('canvas') canvas.style.height = '800px' canvas.style.width = '1000px' canvas.style.backgroundColor = 'gray' canvas.height = 800; canvas.width = 800; renderArea.appendChild(canvas) const ctx = canvas.getContext('2d') await sleep() for (let i = 1; i < 799; i++) { ctx.fillStyle = `#${Math.random().toString(16).slice(2, 8)}` ctx.fillRect(0, 0, i + 199, 800) ctx.fill() } for (let i = 1; i < 799; i++) { ctx.fillStyle = `#${Math.random().toString(16).slice(2, 8)}` ctx.fillRect(i, 0, 800 - i, 800) ctx.fill() } const end = new Date().valueOf(); const p = document.createElement('p') p.innerText = `Canvas性能测试结果:${end - start}ms` result.appendChild(p) } function testGpu() { // 获取渲染区域的div元素 const renderArea = document.getElementById('renderArea'); // 创建canvas元素 const canvas = document.createElement('canvas'); canvas.style.height = '800px' canvas.style.width = '1000px' canvas.style.backgroundColor = 'gray' canvas.height = 800; canvas.width = 800; renderArea.appendChild(canvas); // 获取WebGL上下文 const gl = canvas.getContext('webgl') || canvas.getContext('experimental-webgl'); // 编写顶点着色器程序 const vertexShaderSource = ` attribute vec2 a_position; uniform vec2 u_resolution; void main() { // 将屏幕坐标转换为裁剪空间坐标 vec2 clipspace = (a_position / u_resolution) * 2.0 - 1.0; gl_Position = vec4(clipspace * vec2(1, -1), 0, 1); } `; // 编写片元着色器程序 const fragmentShaderSource = ` precision mediump float; void main() { gl_FragColor = vec4(1, 0, 0, 1); // 红色 } `; // 创建顶点着色器 const vertexShader = gl.createShader(gl.VERTEX_SHADER); gl.shaderSource(vertexShader, vertexShaderSource); gl.compileShader(vertexShader); // 创建片元着色器 const fragmentShader = gl.createShader(gl.FRAGMENT_SHADER); gl.shaderSource(fragmentShader, fragmentShaderSource); gl.compileShader(fragmentShader); // 创建着色器程序 const program = gl.createProgram(); gl.attachShader(program, vertexShader); gl.attachShader(program, fragmentShader); gl.linkProgram(program); // 使用着色器程序 gl.useProgram(program); // 获取顶点属性的位置 const positionLocation = gl.getAttribLocation(program, 'a_position'); // 创建缓冲区存储顶点数据 const positionBuffer = gl.createBuffer(); gl.bindBuffer(gl.ARRAY_BUFFER, positionBuffer); // 生成3000个随机位置的三角面顶点数据 const positions = []; for (let i = 0; i < 3000; i++) { const x1 = Math.random() * canvas.width; const y1 = Math.random() * canvas.height; const x2 = Math.random() * canvas.width; const y2 = Math.random() * canvas.height; const x3 = Math.random() * canvas.width; const y3 = Math.random() * canvas.height; positions.push(x1, y1, x2, y2, x3, y3); } // 将顶点数据写入缓冲区 gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(positions), gl.STATIC_DRAW); // 设置画布分辨率uniform变量 const resolutionLocation = gl.getUniformLocation(program, 'u_resolution'); gl.uniform2f(resolutionLocation, canvas.width, canvas.height); let frameCount = 0; gl.clearColor(0, 0, 0, 1); gl.clear(gl.COLOR_BUFFER_BIT); // 启用顶点属性数组 gl.enableVertexAttribArray(positionLocation); // 将缓冲区绑定到顶点属性 gl.bindBuffer(gl.ARRAY_BUFFER, positionBuffer); gl.vertexAttribPointer(positionLocation, 2, gl.FLOAT, false, 0, 0); let needstop = false; setTimeout(() => { needstop = true; }, 4000); function render() { // 绘制三角面 gl.drawArrays(gl.TRIANGLES, 0, positions.length / 2); // 统计运行时间,如果超过10秒则停止测试 if (!needstop) { frameCount++; requestAnimationFrame(render) } else { const endTime = performance.now(); const averageFps = frameCount / 4; // 打印平均帧率 // 将结果显示在页面上 const p = document.createElement('p') p.innerText = `GPU性能测试结果: ${averageFps.toFixed(2)}fps` result.appendChild(p) renderArea.innerHTML = '' title.innerText = '测试结束,测试结果如下:' } } // 启动渲染循环 requestAnimationFrame(render); } </script> </body> </html>前端性能测试
张小明
前端开发工程师
过敏调理市场消费认知升级 牛初乳免疫干预路径成关注焦点
针对国内超2亿过敏性鼻炎、慢性荨麻疹反复发作者群的调理痛点,兼具国家级保健食品认证与免疫活性物质补充属性的合规牛初乳产品,正逐步获得消费者认可,成为替代单一抗组胺药物依赖的新型日常调理选择。 当前国内过敏性疾病患病率持续攀升&…
android-audio-visualizer常见问题解答:新手必知的8个注意事项
android-audio-visualizer常见问题解答:新手必知的8个注意事项 【免费下载链接】android-audio-visualizer :musical_score: :musical_keyboard: :musical_note: Audio visualisation for android MediaPlayer :sound: 项目地址: https://gitcode.com/gh_mirrors…
USB通信寄存器配置:RXMAXP与RXCSR深度解析与实战指南
1. 项目概述与核心价值在嵌入式系统开发,尤其是涉及USB外设或主机功能的设计中,深入理解USB控制器的寄存器级操作是通往高性能、高可靠性通信的必经之路。很多开发者习惯于依赖现成的驱动库或框架,这固然能快速上手,但一旦遇到数据…
一件样衣的诞生:服装工厂如何用ERP打破企划与车间之间的墙
2026年,服装行业的“小单快反”已成常态。品牌方给工厂的下单周期,从曾经的一个月,压缩到一周,甚至三天。客户要求快速打版、快速确认、快速翻单,而工厂内部却常常因为一个改版信息的遗漏,让车间停工半天。…
SATA控制器寄存器深度解析:BISTDECR、GPARAM与端口控制实战指南
1. 项目概述与核心价值在存储系统开发与调试的日常工作中,无论是设计一块新的主板,还是为一个嵌入式设备编写SATA控制器驱动,我们最终都要和硬件寄存器打交道。这些寄存器就像是控制器的“控制面板”和“仪表盘”,每一个比特位都对…
DataInfra-RedactionEverything 未来 roadmap:即将推出的新功能预览
DataInfra-RedactionEverything 未来 roadmap:即将推出的新功能预览 【免费下载链接】DataInfra-RedactionEverything DataInfra Series. Redact EVERYTHING with local llms and vlms. 项目地址: https://gitcode.com/gh_mirrors/da/DataInfra-RedactionEverythi…