ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

TensorBoard vz_line_chart2 前端微基准测试完全指南:运行、架构与新增 Benchmark 实战

TensorBoard vz_line_chart2 前端微基准测试完全指南:运行、架构与新增 Benchmark 实战 数据可视化机器学习前端后端【免费下载链接】tensorboardTensorFlows Visualization Toolkit项目地址https://gitcode.com/gh_mirrors/te/tensorboard点击查看免费下载导读vz_line_chart2是 TensorBoard 中负责折线图渲染的核心 Polymer 组件标量、分布、直方图等面板的图表都基于它构建而本文档所在的microbenchmark目录专门为其提供了一套浏览器内运行的微基准测试microbenchmark工具用于量化图表初始化、数据绘制、重绘、平滑等关键路径的耗时。读完本文你将掌握如何一键运行这套基准测试、理解其底层运行器与异步排空机制的源码实现并学会按照规范新增属于自己的基准场景为图表性能回归排查提供可复现的量化依据。为什么需要为 vz_line_chart2 做微基准测试折线图是 TensorBoard 用户最频繁交互的视图之一其性能直接影响标量、分布、直方图等面板的流畅度。图表在不同数据规模下1k 点、100k 点、500 条线、不同操作下初始化、重绘、切换 run、调整平滑权重的耗时差异巨大而这些差异很难通过单元测试察觉。microbenchmark目录通过在真实浏览器环境中反复执行受控操作并统计每次迭代耗时把性能变化量化成可对比的数字是排查渲染回归和验证优化效果的重要工具。该工具说明与使用文档位于 microbenchmark/README.md完整源码位于同一目录下。快速开始运行基准测试按 microbenchmark/README.md 的说明运行流程只有三步启动基准测试服务执行 Bazel 命令bazel run tensorboard/components/vz_line_chart2/microbenchmark:binary打开浏览器访问localhost:6006/benchmark.html。确保浏览器处于前台并且不要与页面交互等待测试完成。关于后两步README 给出了两条直接影响测量精度的硬性要求务必要遵守保持浏览器在前台requestAnimationFrame在标签页切到后台时会被浏览器节流行为与前台完全不同会导致测量结果失真不要与浏览器交互任何操作都会注入噪声——尤其是窗口resize会触发 layout 与 compositing 重排污染被测时间。测试运行后结果会通过consoleReporter以console.table的形式打印到浏览器 DevTools 控制台见下文结果输出与解读一节。基准测试框架的源码架构整个基准测试是一个自包含的 TypeScript 模块由入口、注册表、运行器、类型定义、异步排空和报告器六个部分组成文件职责main.ts入口等待requestIdleCallback后执行全部基准并输出结果spec.ts基准注册表提供benchmark()注册方法与getBenchmarks()收集方法types.tsBenchmark/Result/BenchmarkContext接口与Size枚举runner.ts运行器控制迭代次数、计时、GC 采样与生命周期钩子async.ts异步排空patch 全局异步 API使flushAsync可等待全部异步任务完成reporter.ts报告器consoleReporter控制台表格与htmlTableReporter页面表格polymer_util.ts提供polymerFlush等待 Polymer 渲染队列刷新完毕页面装配由 main.html 完成它依次引入polymer.html、plottable.html、vz-line-chart2.html以及各编译产物 JS。入口流程main.ts 的入口逻辑非常简洁(window as any).requestIdleCallback(async () { const results await runner(getBenchmarks()); consoleReporter(results); });getBenchmarks()从 spec.ts 的注册表中取出全部基准定义runner()依次执行每个基准并返回Result[]consoleReporter()把结果打印为控制台表格。使用requestIdleCallback是为了在浏览器空闲时段启动测试避免页面加载初期的解析、编译等工作干扰首轮计时。基准的类型契约与 Size 枚举types.ts 定义了基准的核心契约其中before/run/after/afterEach的语义与 Jasmine 的生命周期钩子一一对应export interface Benchmark { name: string; // 预配置执行次数决定迭代规模。 size: Size; // 语义等同 jasmine 的 before。 before?: (context: BenchmarkContext) void | Promisevoid; // 真正被测的部分可能被执行多次。 run: (context: BenchmarkContext) void | Promisevoid; // 语义等同 jasmine 的 after。 after?: (context: BenchmarkContext) void | Promisevoid; // 语义等同 jasmine 的 afterEach。 afterEach?: (context: BenchmarkContext) void | Promisevoid; }BenchmarkContext提供两个固定成员container被测图表挂载的容器元素和flushAsync异步排空函数并允许通过[key: string]: any扩展自定义字段如多个基准都借助context.chart暂存被创建的图表实例。Size枚举types.ts决定迭代次数映射关系定义在 runner.ts 的getNumIterations()中Size迭代次数适用场景Size.SMALL100轻量、快速的重复操作如单条线重绘Size.MEDIUM25中等开销操作如切换 run、调整平滑权重Size.LARGE10重量级操作如 500 条线的初始化与全量重绘运行器迭代、计时与噪声控制runner.ts 是整套框架的心脏其执行顺序为为每个基准创建一个600px × 400px的容器并设置willChange: transform与contain: content以稳定 compositing 行为以及一个页面左上角悬浮的状态指示条调用patchAsync()接管全局异步 API执行before钩子并flushAsync排空按Size计算迭代次数循环numIterations 1次其中用performance.now()在run前后分别取点计时忽略第一次迭代——源码注释明确说明第一次调用往往噪声较大runner.ts因此首轮只热身不纳入统计每次迭代之间等待 500ms若启用了 GC 测量则缩短为 50ms让浏览器有时间完成上一轮触发的 layout/paint/composite每轮迭代后执行afterEach钩子清理状态全部迭代结束后执行after钩子移除容器与状态条进入下一个基准。此外运行器还支持可选 GC 测量若浏览器以--js-flags--expose_gc启动源码注释见 runner.ts则每轮迭代结束后强制调用window.gc()并记录其耗时用于评估内存压力对性能的影响未启用时timeInGcInMs为null报告器中显示为N/A。异步排空机制async.ts图表渲染高度依赖requestAnimationFrame与setTimeout等异步调度若直接测量run()的同步耗时会漏掉大量排队中的渲染工作。为此 async.ts 的patchAsync()做了三件事用带 Promise 追踪的包装函数替换window.setTimeout与window.requestAnimationFrame每个异步任务都登记进async.promises映射表直接让setInterval抛错Benchmark cannot run when there is an interval确保测试期间没有周期性任务干扰计时提供reset()在基准结束后还原全部原生函数。配套的flushAsync()async.ts会循环等待所有已登记的异步任务完成最后再额外等待一个真实的动画帧保证layout、paint 与 composite 全部完成后才认为一轮迭代结束。这解释了为什么浏览器必须在前台——后台标签页的动画帧被节流flushAsync会等不到帧回调而失真。如何新增一个 BenchmarkREADME 给出了两条新增基准的规范文件命名新建的基准文件必须以_spec.ts作为后缀保持一致性注册方式调用./spec.js暴露的benchmark方法完成注册。结合源码新增一个基准的完整模板如下以初始化图表并绘制单条 1k 数据线为例与 renders_spec.ts 中的内置场景一致import {polymerFlush} from ./polymer_util.js; import {benchmark, Size} from ./spec.js; benchmark({ name: charts init 1k point draw, size: Size.LARGE, async run(context) { // 1. 创建 vz-line-chart2 元素并挂载到容器 context.chart document.createElement(vz-line-chart2) as any; context.chart.style.height 100%; context.container.appendChild(context.chart); // 2. 设置数据与可见序列这些 API 是暂存式的 context.chart.setSeriesData(sine, DATA_POINTS.sine1k); context.chart.setVisibleSeries([sine]); // 3. 一次性提交变更并等待 Polymer 渲染完成 context.chart.commitChanges(); await polymerFlush(); }, afterEach(context) { context.container.removeChild(context.chart); }, });随后在 main.html 中加入script src./你的文件.js/script即可被入口收集。新建的基准文件会被 spec.ts 的benchmark()推入内部数组无需任何手动登记。被测关键 API 的语义要点新增场景时理解vz-line-chart2的 API 语义至关重要。这些 API 定义在 line-chart.ts 中均采用**暂存后统一提交**模式setSeriesData(name, data)line-chart.ts暂存一条序列的数据变更同时调用disableChanges()将 plot 的 datasets 暂时清空避免中途反应setVisibleSeries(names)line-chart.ts暂存可见序列集合内部会对名字排序并反转顺序保证第一条序列绘制在最上层commitChanges()line-chart.ts把暂存内容一次性应用到linePlot/smoothLinePlot/marginAreaPlot若启用了平滑还会对脏数据集重新平滑最后通过 RAF 触发布局重测。每个set*调用之后都必须commitChanges()才会生效redraw()line-chart.ts先取消上一次待执行的 RAF再调度一次重绘——这正是基准场景redraw系列要测量的路径smoothingUpdate(weight)/smoothingDisable()line-chart.ts切换平滑权重或开关平滑内部涉及对全部数据集重算指数平滑值并更新散点 accessor是平滑变更系列基准的核心操作。内置基准场景解析renders_spec.ts 内置了 12 个基准场景覆盖图表生命周期的主要性能路径。测试数据由文件头部生成sine1k/cosine1k各 1000 点、cosine100k100000 点以及FIVE_HUNDRED_1K_DATA_POINTS500 条各含 1000 点、带随机噪声的序列用于构造海量数据压力场景。场景名Size测量内容charts initLARGE创建空图表并提交变更的初始化成本charts init 1k point drawLARGE初始化 绘制单条 1k 数据线的组合成本redraw: one line of 1k drawsSMALL单条 1k 数据线的重绘redraw: one line of 100k drawsLARGE单条 10 万点数据线的重绘数据量压力redraw: alternative two 1k linesMEDIUM交替切换两条 1k 序列可见性的重绘redraw: 500 lines of 1k pointsLARGE500 条线 × 1k 点的全量重绘最重场景make new chart: 10 lines of 1k pointsMEDIUM新建 10 条线的图表并轮换xTypestep/relative/wall_time/ 空值redraw 100 charts (1k points)LARGE一次性重绘 100 个各含 1k 点的图表多图表压力toggle run on 100 charts (1k points)MEDIUM在 100 个图表上先全部隐藏再全部显示序列run 切换场景smoothing change: 1k pointsMEDIUM在 0.8 / 0.2 之间交替调整 1k 点图表的平滑权重smoothing change: 100k pointsMEDIUM10 万点图表上的平滑权重切换smoothing change: 100k points: large screen (1200x1000)LARGE10 万点 大画布容器放大到 1200×1000的平滑切换其中before钩子负责搭建被测状态创建图表、灌入数据、提交变更run只保留要测量的单次操作afterEach负责销毁——这种搭建与测量分离的写法保证了run的计时干净且可重复。结果输出与解读README 附上了一组在固定硬件与浏览器环境下的参考运行结果由consoleReporter输出列格式为name | numIterations | avgTimenamenumIterationsavgTimecharts init1065.9879999991972ms / runcharts init 1k point draw1066.03100000065751ms / runredraw: one line of 1k draws10096.12760000105482ms / runredraw: one line of 100k draws10854.3104999960633ms / runredraw: alternative two 1k lines2563.42060000053607ms / runredraw: 500 lines of 1k points102203.0529999989085ms / runmake new chart: 10 lines of 1k points2530.425399995874614ms / runredraw 100 charts (1k points)101153.0329999979585ms / runtoggle run on 100 charts (1k points)256214.246399998665ms / runsmoothing change: 1k points2562.69300000043586ms / runsmoothing change: 100k points253320.5062000011094ms / runsmoothing change: 100k points: large screen (1200x1000)104624.3224999983795ms / run该组数据的参考环境为硬件MacBookPro13,2i7 3.3GHz系统macOS 10.15.4浏览器Google Chrome 80.0.3987.149注意这些数字仅代表当时该环境下的绝对耗时不宜跨机器横向比较其价值在于同一环境下修改代码前后的纵向对比。avgTime的计算方式见 reporter.tstotalTimeInMs / numIterations其中totalTimeInMs已排除被忽略的首次迭代。若你更倾向在页面上查看结构化结果可以自行将入口中的consoleReporter替换为htmlTableReporterreporter.ts。后者会在页面顶部渲染一个 HTML 表格除平均耗时外还提供Min / Max / Std Deviation标准差/ Avg GC Time四个统计列其中标准差基于每轮迭代耗时的方差平方根计算用于判断测量的稳定性Avg GC Time仅在浏览器以--expose_gc启动时才有值否则显示N/A。测量可靠性要点汇总综合 README 与运行器源码要得到可信的基准数据请遵守以下要点浏览器保持前台后台标签页的requestAnimationFrame会被节流而flushAsync依赖真实动画帧确认渲染完成测试期间不操作页面resize会触发额外的 layout 与 compositing键盘、鼠标行为同样会注入噪声以同环境对比为准绝对数值随硬件、OS、Chrome 版本浮动README 明确记录了参考环境跨环境对比无意义纵向回归对比才有价值首次迭代不计入统计运行器自动忽略第一轮热身因为其对缓存、JIT 等状态最敏感迭代间留出 500ms 间隔让上一轮的渲染副作用彻底落定避免相互污染如需 GC 数据以--js-flags--expose_gc启动 Chrome报告中会额外出现Avg GC Time列源码提示见 runner.tsSize决定迭代次数SMALL100、MEDIUM25、LARGE10轻量操作用高迭代次数摊平噪声重量操作用低迭代次数控制总时长。小结microbenchmark目录为vz_line_chart2提供了一套麻雀虽小五脏俱全的浏览器内性能测量框架spec.ts的注册表 runner.ts的迭代运行器 async.ts的异步排空 双报告器配合 12 个覆盖初始化、重绘、run 切换、平滑等关键路径的内置场景构成了图表性能回归检测的完整闭环。新增基准只需三步——建_spec.ts文件、用benchmark()注册、在main.html引入脚本读懂上述运行机制后你还可以根据自己的性能关注点例如缩放到新数据规模、增加序列数量、组合平滑与多图表扩展出更贴合的测试场景。相关源码与文档入口README.md、runner.ts、renders_spec.ts、async.ts。赞分享数据可视化机器学习前端后端【免费下载链接】tensorboardTensorFlows Visualization Toolkit项目地址https://gitcode.com/gh_mirrors/te/tensorboard点击查看免费下载相关推荐RocksDB 微基准测试Micro-Benchmark完全指南原理、构建运行与最佳实践RocksDB 微基准测试Micro Benchmark完全指南原理、构建运行与最佳实践 RocksDB 微基准测试micro benchmark是面数据库KV存储嵌入式数据库存储libgit2 CLI 基准测试Benchmark框架完全指南运行、编写与结果解读libgit2 CLI 基准测试Benchmark框架完全指南运行、编写与结果解读 本指南以 benchmarks/cli/README.md https开发工具COLMAP 运行时基准测试benchmark/runtime完全指南安装、构建与六大可执行基准详解COLMAP 运行时基准测试benchmark/runtime完全指南安装、构建与六大可执行基准详解 本指南以 COLMAP 仓库中的 benchmark计算机视觉图形学图像处理上一篇Civitai 组件预览实战基于 Ladle Mantine v7 Tailwind 的隔离式 UI 开发与视觉回归工作流下一篇MMPose 人脸关键点检测HRNetv2-W18 在 300W 数据集上的 Top-Down 热力图训练与评估实战指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表