当前位置: 首页 > news >正文

前端性能测试

<!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>
http://www.cnnetsun.cn/news/3589069.html

相关文章:

  • 过敏调理市场消费认知升级 牛初乳免疫干预路径成关注焦点
  • android-audio-visualizer常见问题解答:新手必知的8个注意事项
  • USB通信寄存器配置:RXMAXP与RXCSR深度解析与实战指南
  • 一件样衣的诞生:服装工厂如何用ERP打破企划与车间之间的墙
  • SATA控制器寄存器深度解析:BISTDECR、GPARAM与端口控制实战指南
  • DataInfra-RedactionEverything 未来 roadmap:即将推出的新功能预览
  • 计算机毕业设计之助农产品销售平台
  • go-plugin性能优化指南:提升WebAssembly插件执行效率的6个技巧
  • playcurlNEXT工作原理解析:为什么它能确保每次启动都获取最新Play Integrity指纹?
  • 22| 手写一个迷你tcpdump
  • HDVPSS图像缩放与编码实战:多相滤波器与SD_VENC配置详解
  • 嵌入式视频处理:中断映射与色度上采样的核心原理与工程实践
  • LongNet快速上手指南:5分钟搭建你的首个10亿Token级Transformer模型
  • TI Tiva TM4C129x Hibernation模块实战:RTC、篡改检测与低功耗管理
  • AtomPePacker技术揭秘:LZMA压缩算法在PE文件保护中的应用
  • 【SVM预测】基于人工蜂群算法优化支持向量机SVM实现数据预测附Matlab代码
  • JavaScript Application Design: A Build First Approach完全指南:从入门到精通的项目实战
  • 【2024最硬核AI插件开发课】:基于RAG+边缘推理的轻量级Chrome AI助手,实测启动<300ms,内存占用下降67%
  • Groestlcoin Core钱包使用详解:创建、加密与备份的完整流程
  • TMS320F2837xD CAN与USB控制器实战:IF3UPD自动更新与端点FIFO管理
  • 教程内容AI化已成刚需:2024年Q2最新调研显示,未掌握AI写作的课程开发者淘汰率飙升至64.3%
  • 计算机毕业设计之基于SpringBoot的生鲜交易系统
  • LangChain是个什么?—— 一文读懂大语言模型应用开发框架
  • 当无人机睁开“全知之眼“:Insta360等机构联合打造的全景视频AI
  • F2837xD看门狗与低功耗模式:嵌入式系统可靠性与能效的平衡艺术
  • Cortex-M3异常处理与内存同步机制详解
  • 终极语音克隆教程:用local-talking-llm复刻任意声音只需10秒音频样本
  • 2026平价行李箱推荐:热门实测横评,学生党上班族照着选不踩坑
  • Trampoline RTOS性能优化:内存占用与执行效率提升策略
  • python-dotenv