前端性能测试
!DOCTYPE html html langen head meta charsetUTF-8 meta nameviewport contentwidthdevice-width, initial-scale1.0 title前端性能测试/title /head body divbutton onclickalert( 1. 运算测试计算十亿次浮点数相加和相乘统计时间 2. 连续内存读写测试创建长度为十万的数组进行一百万次随机位置读写统计时间 3. 随机排序测试创建长度为一万的数组进行随机排序100次统计时间 4. Dom性能测试重复执行一千次浏览器节点插入和计算尺寸统计时间 5. Canvas性能测试在画布上进行1600次矩形绘制统计时间 6. Webgl支持测试测试浏览器是否支持webgl 7. GPU测试使用显卡渲染3000个三角面时长4秒统计平均帧率)测试内容说明/button/div div idtitle button onclickstart()开始测试/button /div div idresult/div div idrenderArea 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

相关新闻

深入解析DDR2/mDDR内存控制器:调度算法、地址映射与低功耗设计

深入解析DDR2/mDDR内存控制器:调度算法、地址映射与低功耗设计

1. 项目概述与核心价值在嵌入式系统、移动设备和各类计算平台的设计中,内存子系统往往是决定整体性能、功耗和稳定性的关键瓶颈。处理器(CPU/SoC)的速度日新月异,但动态随机存取存储器(DRAM)的访问延迟和带…

2026/7/22 18:44:41 阅读更多 →
AM335x引脚复用配置详解:从寄存器操作到设备树实践

AM335x引脚复用配置详解:从寄存器操作到设备树实践

1. 项目概述:从硬件引脚到软件配置的桥梁 在嵌入式系统开发中,尤其是基于德州仪器(TI)AM335x这类高度集成的应用处理器时,我们经常会遇到一个核心矛盾:芯片内部集成了丰富的外设,如以太网MAC&am…

2026/7/22 18:43:41 阅读更多 →
360获颁首批智能体身份码节点 深度参编智能体互联系列国家标准

360获颁首批智能体身份码节点 深度参编智能体互联系列国家标准

7月21日,《人工智能 智能体互联》系列国家标准应用推广专题会在北京中关村展示中心召开,会上正式举行智能体身份码节点首批发放仪式。360集团获颁首批智能体身份码节点,成为我国智能体互联国家标准落地进程的核心参与方。本次专题会由全国信息…

2026/7/22 18:43:41 阅读更多 →

最新新闻

鸿蒙报错速查:arkts-strict-typing 初始化类型不匹配 + 成员忘初始化,根因 + 真解法

鸿蒙报错速查:arkts-strict-typing 初始化类型不匹配 + 成员忘初始化,根因 + 真解法

报错原文 三个高频报错扎堆: ERROR: 10505001 ArkTS Compiler Error Error Message: Type undefined is not assignable to type number. At File: xxx.ets:N:NError Message: Property name has no initializer and is not definitely assigned in the constructor…

2026/7/22 19:37:07 阅读更多 →
特种炭黑 导电炭黑 色素炭黑

特种炭黑 导电炭黑 色素炭黑

引言:被低估的工业“黑金” 在材料科学的浩瀚星空中,有一种黑色粉末,它虽不起眼,却深刻影响着从日常橡胶制品到尖端航天科技的无数领域。它,就是特种炭黑。与普通炭黑不同,特种炭黑并非燃料不完全燃烧的简单…

2026/7/22 19:37:07 阅读更多 →
珠海多创电流传感器获得 IATF16949 认证,开启充电桩传感新纪元

珠海多创电流传感器获得 IATF16949 认证,开启充电桩传感新纪元

前言距离 2026 年 8 月 1 日充电桩 CCC 强制认证全面落地仅剩10天,新能源充电产业正迎来标准化、合规化深度洗牌作为充电桩安全防护的核心元器件,剩余电流传感器的精度、稳定性与体系管控能力,直接决定整机认证效率与长期场站运行安全。近日&…

2026/7/22 19:37:06 阅读更多 →
3分钟搞定!VideoDownloadHelper免费视频下载完全指南

3分钟搞定!VideoDownloadHelper免费视频下载完全指南

3分钟搞定!VideoDownloadHelper免费视频下载完全指南 【免费下载链接】VideoDownloadHelper Chrome Extension to Help Download Video for Some Video Sites. 项目地址: https://gitcode.com/gh_mirrors/vi/VideoDownloadHelper 你是不是经常在网上看到精彩…

2026/7/22 19:37:06 阅读更多 →
终极iOS架构指南:Coordinator设计模式如何彻底解耦你的ViewController

终极iOS架构指南:Coordinator设计模式如何彻底解耦你的ViewController

终极iOS架构指南:Coordinator设计模式如何彻底解耦你的ViewController 【免费下载链接】Coordinator Implementation of Coordinators app design pattern. 项目地址: https://gitcode.com/gh_mirrors/co/Coordinator Coordinator设计模式是GitHub加速计划中…

2026/7/22 19:37:06 阅读更多 →
容器化部署goflow2:Docker与Kubernetes环境下的最佳实践

容器化部署goflow2:Docker与Kubernetes环境下的最佳实践

容器化部署goflow2:Docker与Kubernetes环境下的最佳实践 【免费下载链接】goflow2 High performance sFlow/IPFIX/NetFlow Collector 项目地址: https://gitcode.com/gh_mirrors/go/goflow2 goflow2是一款高性能的sFlow/IPFIX/NetFlow流量采集器,…

2026/7/22 19:36:06 阅读更多 →

日新闻

TI DSP系统配置模块SYSCFG详解:中断机制与主设备优先级配置实战

TI DSP系统配置模块SYSCFG详解:中断机制与主设备优先级配置实战

1. 项目概述与SYSCFG模块的核心价值在嵌入式系统,尤其是像TI C6000系列这样的高性能DSP开发中,我们常常会与芯片手册里那些密密麻麻的寄存器打交道。很多开发者可能更关注算法实现、内存优化或者外设驱动,但对于一个稳定、高效的系统而言&…

2026/7/22 0:00:26 阅读更多 →
微信Server酱:高到达率的应急通知方案实践

微信Server酱:高到达率的应急通知方案实践

1. 为什么我们需要"最次"的通知方案? 在数字化协作环境中,消息通知系统的重要性不言而喻明。但现实情况是,企业级通知方案往往需要复杂的API对接(如企业微信、钉钉、飞书),个人开发者的小项目又经…

2026/7/22 0:00:26 阅读更多 →
甲方要的“简洁“PPT,到底是简洁还是省事?

甲方要的“简洁“PPT,到底是简洁还是省事?

甲方说"简洁一点",乙方听到的是"少做几页"。甲方说"不要太复杂",乙方理解成"别放图表了"。结果交过去,甲方说"我说的简洁不是这个意思"。"简洁"这个词在PPT语境里,是…

2026/7/22 0:00:26 阅读更多 →

周新闻

Go语言静态资源打包方案对比与实践指南

Go语言静态资源打包方案对比与实践指南

1. 项目背景与核心需求在Go语言开发中,我们经常需要处理静态资源文件的打包问题。无论是Web应用的模板文件、前端资源,还是配置文件、证书等,都需要随程序一起分发。传统做法是将这些文件与编译后的二进制文件放在同一目录下,但这…

2026/7/22 8:58:19 阅读更多 →
Go语言实现高性能LDAP认证服务的架构与实践

Go语言实现高性能LDAP认证服务的架构与实践

1. 项目背景与核心价值LDAP(轻量级目录访问协议)作为企业级身份认证的黄金标准,已经服务了超过80%的财富500强公司。我在金融科技领域实施统一认证体系时,发现传统Java方案存在启动慢、内存占用高等痛点。而Go语言凭借其协程并发模…

2026/7/21 5:34:47 阅读更多 →
【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

更多请点击: https://intelliparadigm.com 第一章:AI面试官实战指南的核心价值与适用场景 AI面试官并非替代人类HR的“黑箱工具”,而是以可解释、可审计、可迭代的方式,赋能招聘全链路的关键基础设施。其核心价值在于将主观经验沉…

2026/7/22 12:54:44 阅读更多 →

月新闻