Dart SDK 内置 vm_snapshot_analysis 变更日志全解:0.1.0 至 0.7.6 版本演进与源码印证
编程语言编译器语言运行时标准库开发工具【免费下载链接】sdkThe Dart SDK, including the VM, JS and Wasm compilers, analysis, core libraries, and more.项目地址https://gitcode.com/gh_mirrors/sdk1/sdk点击查看免费下载本文基于 Dart SDK 仓库中的 CHANGELOG.md 完整梳理vm_snapshot_analysis包从 0.1.0 到 0.7.6 的全部版本变更记录,并结合当前仓库源码验证每一处关键 API 与 CLI 参数的落地形态。读完本文,你将掌握这个 AOT 快照体积分析工具的能力演进脉络、每个里程碑引入的核心功能(依赖树深度参数、支配树、compareProgramInfo等)的来历,以及如何在当前版本中复现这些能力。包的定位与当前版本vm_snapshot_analysis是 Dart SDK 仓库pkg/目录下的一个工具包,提供解析 Dart VM AOT 快照体积与内容的能力,其数据来源于 AOT 编译器的--print-instructions-sizes-to、--write-v8-snapshot-profile-to与--trace-precompiler-to三类输出(见 README.md)。从 pubspec.yaml 可以确认,当前仓库中的包版本与 CHANGELOG 的最新条目一致:version: 0.7.6,与 CHANGELOG 中最新的## 0.7.6条目对应;environment: sdk: ^3.5.0,即 0.7.6 条目中等待提升 SDK 下界所指的正是这个 Dart 3.5 下界;executables: snapshot_analysis: analyse,CLI 入口指向 bin/analyse.dart。版本演进总览CHANGELOG 共记录了 0.1.0 到 0.7.6 的 15 个版本条目,按时间顺序(从新到旧)可以归纳为五个阶段:阶段版本主题最新0.7.4 / 0.7.5 / 0.7.6稳定性修复与PatchClass字段兼容null-safety0.7.0 / 0.7.1 / 0.7.2 / 0.7.3-dev空安全迁移、dominator可空化、lints 升级功能完善0.5.x / 0.6.0compareProgramInfo、依赖树深度参数、调用图支配树生成能力扩张0.4.0 / 0.3.0对比 treemap、precompiler trace、explain dynamic-calls起步0.2.0 / 0.1.0归属(ownership)计算修复、初始发布起步阶段:0.1.0 与 0.2.0 的归属修复CHANGELOG 记述 0.1.0 为Initial release,而 0.2.0 立即修复了一个影响数据正确性的核心问题:Fix owner computation code for V8 profiles: the size of a snapshot node which corresponds to aProgramInfoNodeshould be attributed to thatProgramInfoNodeand not to its parent.即:V8 快照 profile 中某个快照节点(例如Function节点)对应的ProgramInfoNode的体积,此前被错误地归到其父节点,修复后才归到节点自身。这条修复之所以重要,是因为整个包的输出(summary 表格、compare 差异、treemap)都建立在字节归属这一抽象之上,归属错误会直接污染所有下游报表。0.2.0 还更新了 CLI 帮助文案(避免把 pub 生成的快照当作脚本名)以及 ProgramInfoNode.size 的文档说明,明确了该成员的含义。功能扩张:0.3.0 与 0.4.00.3.0 完成了两件架构层面的事:treemap 构建代码抽取为独立库,使其可复用;引入--format折叠粒度控制,通过TreemapFormat format参数(编程接口)或--format标志(CLI)从四种模式中选择:collapsed:基本按ProgramInfo结构渲染 treemap,忽略单个快照节点;simplified:在collapsed基础上把嵌套函数的体积折叠进最外层函数(顶层函数或方法);data-and-code:按节点代表数据还是可执行代码折叠快照节点;object-type(默认):仅按节点类型折叠。同版本还改变了Code节点的归属方式:由函数持有的Code节点不再单独建ProgramInfoNode,而是把该Code及其保留(retained)节点直接记到函数本身的ProgramInfoNode名下;stub(包括分配 stub)则创建一个人工的functionNode;NodeType.other自此仅用于字段(field)。0.4.0 是功能上最重要的一版,CHANGELOG 记录了四项新增:buildComparisonTreemap:构造表示两个体积 profile 之间 diff 的 treemap;支持从 AOT 编译器 trace(--trace-precompiler-to标志,解析代码见 precompiler_trace.dart)提取调用图信息;新增explain dynamic-calls子命令:结合体积 dump(如 V8 snapshot profile)与 AOT 编译器 trace,估算不同动态调用对最终 AOT 快照大小的影响;summary命令可结合 AOT 编译器 trace 把包/库与其依赖归组,给出某个包/库究竟为快照带来多少体积的更精确估算。对应的实现分别落在 commands/explain.dart 与 commands/summary.dart 中,explain dynamic-calls的近似保留体积正是通过对调用图支配树的遍历累加得到的。API 化阶段:0.5.x 系列0.5.x 系列把包从CLI 工具推向可嵌入的库,CHANGELOG 中的每条记录都能在现有代码中找到对应物:0.5.01:修复包损坏问题,把不可执行文件移出bin/目录(当前bin/下确实只剩 analyse.dart 一个入口);0.5.0:把dart:io依赖从lib中移除、commands迁到bin;loadProgramInfo工具方法被loadProgramInfoFromJson取代,后者接收Object参数而非File;buildComparisonTreemap的oldJson/newJson两个参数也从File改为Object;compare命令在信息可用时会按节点类型输出差异分解。这一改动的意义在于让库层不再绑定文件系统,便于在 CI、Web 或内存管道中复用;0.5.2:支持形如package:foo.bar.baz/src/foobar.dart的包路径(含点号的多段包名);0.5.4:修复Type类名的冲突;0.5.3:新增compareProgramInfo,接收两个 program info 对象并输出包含 diff 数据的Map。当前 utils.dart 中仍可看到loadProgramInfoFromJson(L12)与compareProgramInfo(L36)两个 API,签名与 0.5.0/0.5.3 的变更记录完全吻合;0.5.5(CLI 参数设计的重要节点):新增summary命令的deps-display-depth(-d)标志,使输出的依赖树展示深度可配置;将原deps-collapse-depth(曾用-d)更名为deps-start-depth(现-s);新增generateCallGraphWithDominators方法,可从 precompiler trace 生成带支配树的CallGraph对象。当前 summary.dart 中的参数定义印证了这一设计:--deps-start-depth/-s默认值为2(该深度及更浅的节点会被折叠),--deps-display-depth/-d默认值为4(更深的节点以汇总形式展示),且两者均注明仅在同时传入--precompiler-trace时生效。0.6.0:依赖升级0.6.0 是一条纯维护性记录:升级到最新的args、path、meta依赖。这为后续 0.7.0 的空安全迁移扫清了依赖障碍——空安全迁移要求所有传递依赖都已完成 null-safety,0.6.0 正是这一步准备。null-safety 迁移:0.7.0 及其后续0.7.0:整体迁移到 null-safety。这是 Dart 生态的普遍性版本,但对一个输出结构化数据的库而言,可空性的设计直接影响 API 语义,下一版就体现了这一点;0.7.1:将CallGraphNode.dominator改为可空(Nullable)。在 precompiler_trace.dart 中可以看到当前实现:CallGraphNode? dominator;,注释说明该字段由CallGraph.computeDominators计算。可空化的合理之处在于:支配树只有在调用computeDominators之后才有意义,空安全类型让尚未计算这一状态从约定变成了类型层面的事实;0.7.2:升级到package:lints2.0,并填充 pubspec 的repository字段(当前 pubspec.yaml 第 4 行的repository即由此而来);0.7.3-dev:更新 README,记录当时生成 Dart AOT 快照的方式;修正 dartdoc 注释中的拼写错误。稳定性修复:0.7.4、0.7.5 与 0.7.6CHANGELOG 中最后三个版本都是缺陷修复,体现了该包在真实工作负载(尤其是 Flutter 场景)下的打磨过程:0.7.4 / 0.7.5(对应 flutter/flutter#128402 与 flutter/flutter#130009):修复尝试查询 type testing stubs 的 owner info 节点时触发 null check error的问题。两条记录描述同一类根因,0.7.5 是对 0.7.4 同类问题的再次修补,说明 stub 归属路径上的边界条件不止一处;0.7.6(当前版本):Allow the oldpatched_class_field forPatchClassuntil we change the SDK lower bound for this package to a version that does not have it.即:在PatchClass节点解析中,暂时同时接受新旧两个字段名,直到本包的 SDK 下界提升到不再产出旧字段的版本。这条变更记录在现有源码中有精确对应,见 v8_profile.dart:case PatchClass: // Allow the old patched_class_ field if the wrapped_class_ field does // ... final wrappedClass node[wrapped_class_] ?? node[patched_class_]!;wrapped_class_(新字段)优先,patched_class_(旧字段)作为回退——这正是 CHANGELOG 所述双字段兼容窗口的实现形态,而兼容窗口的关闭条件(提升 pubspec.yaml 中的sdk: ^3.5.0下界)也已在条目中写明。从源码结构看:版本记录与实现的对应关系把 CHANGELOG 的关键条目映射回当前仓库,可以确认记录与实现保持一致,这也说明了这份变更日志作为演进地图的可信度:CHANGELOG 条目版本当前源码位置-s/-d依赖树深度参数0.5.5summary.dart,默认 2 / 4compareProgramInfo0.5.3utils.dartloadProgramInfoFromJson(Object 参数)0.5.0utils.dartprecompiler trace 解析与generateCallGraphWithDominators系列能力0.4.0 / 0.5.5precompiler_trace.dart,CallGraph.collapse等CallGraphNode.dominator可空0.7.1precompiler_trace.dartpatched_class_旧字段兼容0.7.6v8_profile.dartrepository字段0.7.2pubspec.yaml需要注意的适用前提:上述版本与行为均以当前仓库pkg/vm_snapshot_analysis目录的实际内容为准,包版本锁定为 0.7.6;若通过 pub 全局安装(如pub global activate vm_snapshot_analysis)获取,实际行为可能随 pub 上发布的版本而变化,与仓库主干不一定一致。如何复现变更日志中描述的用法结合 CHANGELOG 与 README.md,当前版本下可复现的完整工作流为:# 1. 编译时同时产出 profile 与 trace $ dart compile exe --extra-gen-snapshot-options--write-v8-snapshot-profile-toprofile.json --extra-gen-snapshot-options--trace-precompiler-totrace.json -o binary input.dart # 2. 按包统计快照体积,并展示依赖树(0.5.5 引入的 -s/-d 参数) $ dart run pkg/vm_snapshot_analysis/bin/analyse.dart summary -b package -s 1 -d 3 --precompiler-tracetrace.json profile.json # 3. 对比新旧两份 profile 的差异(0.5.0 起按节点类型分解差异) $ dart run pkg/vm_snapshot_analysis/bin/analyse.dart compare -b class old.json new.json # 4. 估算动态调用的体积影响(0.4.0 引入) $ dart run pkg/vm_snapshot_analysis/bin/analyse.dart explain dynamic-calls profile.json trace.json # 5. 生成 treemap(0.3.0 引入的 --format 四种折叠模式) $ dart run pkg/vm_snapshot_analysis/bin/analyse.dart treemap --format simplified profile.json out/以上命令形态与 README 中snapshot_analysis全局安装后的用法一一对应,差异仅在于此处直接以仓库内 bin/analyse.dart 作为入口运行,便于在 SDK 源码树中验证各版本引入的能力。赞分享编程语言编译器语言运行时标准库开发工具【免费下载链接】sdkThe Dart SDK, including the VM, JS and Wasm compilers, analysis, core libraries, and more.项目地址https://gitcode.com/gh_mirrors/sdk1/sdk点击查看免费下载相关推荐openai-agents-python 版本机制与破坏性变更演进全指南0.1.0 至 0.22.0 变更日志深度解读openai agents python 版本机制与破坏性变更演进全指南0.1.0 至 0.22.0 变更日志深度解读 本指南以 openai agents人工智能AI AgentAgent 框架多智能体工具调用MCP ClientsSeaTunnel MaxCompute 连接器变更日志全解析2.3.0 至 2.3.12 的关键演进与源码印证SeaTunnel MaxCompute 连接器变更日志全解析2.3.0 至 2.3.12 的关键演进与源码印证 本文以仓库中的 MaxCompute 连接器数据集成ETL大数据批处理流处理变更数据捕获Hyperledger Fabric 版本演进史从 v0.6 到 v2.0 的变更日志解读与源码印证Hyperledger Fabric 版本演进史从 v0.6 到 v2.0 的变更日志解读与源码印证 导读 本篇文章以仓库根目录 CHANGELOG.md h区块链密码学上一篇JNativeHook项目架构分析从Java到C的跨语言调用深度剖析下一篇Go语言终极队列解决方案dque嵌入式持久化队列完全指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

AMD平台RL训练bitwise一致:RL-Kernel与vime实战解析

AMD平台RL训练bitwise一致:RL-Kernel与vime实战解析

如果你问我,在 RL 训练系统里最容易藏雷的地方是哪里,我不会先说分布式采样、内存泄漏或者梯度过大,而是“训练和 rollout 在数值上差了最后几个 bit”。尤其是当训练侧跑在 RL-Kernel 这类自研内核上,环境侧跑在 vime 这类模拟执…

2026/9/26 7:23:42 阅读更多 →
树莓派4B装ROS2 Humble完整指南:从系统配置到环境部署

树莓派4B装ROS2 Humble完整指南:从系统配置到环境部署

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/25 6:48:17 阅读更多 →
Atlas 300V 24G推理卡YOLO部署全流程实战指南

Atlas 300V 24G推理卡YOLO部署全流程实战指南

上个月帮客户做一套边缘巡检方案,前前后后折腾了两周,最终选定的硬件方案里就有华为的 Atlas 300V 24G 推理加速卡。坦率讲,这张卡在圈子里的热度一直不低,但真把它用来跑 YOLO 系列模型,从环境搭建到模型转换&#xf…

2026/9/25 6:48:17 阅读更多 →

最新新闻

AIGC全栈落地实战:大模型、向量数据库与云渲染的算力延迟破局

AIGC全栈落地实战:大模型、向量数据库与云渲染的算力延迟破局

1. 从"能跑通"到"跑得稳":AIGC落地真正的分水岭 大模型这个词这两年已经被说烂了,但真正在一线做过AIGC项目交付的人心里都清楚,模型能不能出结果只是入场券,能不能在真实业务里稳定、低延迟、可计量地跑起来…

2026/9/26 8:52:37 阅读更多 →
Windows下MinGW编译PCL全流程:从依赖库到Qt点云可视化

Windows下MinGW编译PCL全流程:从依赖库到Qt点云可视化

简介:基于Qt的MinGW编译点云库及其全部依赖库的完整资源包,面向在Windows环境下使用MinGW工具链从事三维点云开发的C工程师。资源解决了PCL在Qt环境中编译时依赖库难以配齐的问题,提供了Boost、Eigen、FLANN、Qhull、VTK等底层库的头文件与编…

2026/9/26 8:52:37 阅读更多 →
SVG图标实战指南:从选型、压缩到版权与兼容性避坑

SVG图标实战指南:从选型、压缩到版权与兼容性避坑

1. 为什么现在还在用PNG做图标?SVG才是现代UI的底层基建你有没有遇到过这样的情况:在给一个响应式网站加图标时,设计师扔过来一套PNG,结果在Retina屏上糊成一片;或者想改个颜色,得重新切图、换资源、清缓存…

2026/9/26 8:52:37 阅读更多 →
大型制造企业MES建设方案:可落地的排产、追溯与缺陷闭环

大型制造企业MES建设方案:可落地的排产、追溯与缺陷闭环

简介:本资源是一份面向大型制造企业信息化建设者的MES(制造执行系统)全周期建设方案,聚焦生产计划排产、执行反馈、ERP集成及现场工控协同等核心场景,解决多系统集成难、排产灵活性不足、过程透明度低等典型痛点。文档…

2026/9/26 8:52:37 阅读更多 →
开源代码审查协议:策略即代码的AI协作范式

开源代码审查协议:策略即代码的AI协作范式

1. 这不是又一个“AI代码审查”玩具,而是一套可嵌入开发流程的开源协作协议 最近在几个技术社区里反复看到“open-code-review”这个词被拎出来讨论,不是作为某个商业产品的宣传话术,而是开发者在 Slack 频道里甩出的一行命令: o…

2026/9/26 8:52:37 阅读更多 →
Atlas 300V推理加速卡实战:从环境配置到YOLO模型部署全解析

Atlas 300V推理加速卡实战:从环境配置到YOLO模型部署全解析

先把结论放到最前面:Atlas 300V系列毫无疑问是运算加速卡,但它的"加速"和大多数人熟悉的GPU加速完全是两码事。我见过不少朋友把这张卡买回来,插上服务器,装好驱动,然后对着npu-smi里那一串输出发呆——接下…

2026/9/26 8:51:37 阅读更多 →

日新闻

数据库课后习题答案别硬背:当测试用例集刷,效率翻倍

数据库课后习题答案别硬背:当测试用例集刷,效率翻倍

简介:万常选版《数据库原理与设计》课后习题答案资源,覆盖第2至6章及第9章,适合正在学习关系模型、数据库建模、关系数据理论与模式求精的本科生、自学者作为复习与自测材料。压缩包共7个文件,含3个doc参考答案、2个sql示例脚本、…

2026/9/26 0:00:25 阅读更多 →
学校官网模拟全流程实践:从页面布局到后端接口与部署

学校官网模拟全流程实践:从页面布局到后端接口与部署

如果你正在找一门 Web 大作业的题目,或者刚开始接触 Web 前端开发想做点能拿来展示的东西,“学校官网模拟”几乎是最稳的选择。题目看着简单,但要把导航、新闻列表、轮播 Banner、二级页面、后台数据都串起来,其实已经把前端布局、…

2026/9/26 0:00:25 阅读更多 →
超级玛丽游戏源码C++:从零搭建横版跳跃游戏工程

超级玛丽游戏源码C++:从零搭建横版跳跃游戏工程

简介:这是一份面向游戏开发初学者与C进阶学习者的超级玛丽(超级马里奥)游戏源码,基于C面向对象编程实现,适合想通过经典项目理解游戏主循环、角色类设计、地图关卡加载与物理碰撞检测的读者参考。压缩包共49个文件&…

2026/9/26 0:00:25 阅读更多 →

周新闻

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

直接铺开项目本身吧。这几个月我一直在折腾一件事:用Flutter给OpenHarmony做一款游戏集合类的App,说白了就是把若干小游戏塞进一个壳里,用统一入口分发。这个方向本身不算新鲜,真正让我花了不少心思的,是首页那堆游戏卡…

2026/9/25 19:27:14 阅读更多 →
Word表格编号全攻略:从列表编号到题注交叉引用

Word表格编号全攻略:从列表编号到题注交叉引用

写Word文档,最让人头疼的往往是那些“看起来不起眼”的小问题。比如表格编号这事:今天在表后面多加了两个空白行,明天给客户交稿前发现整个章节的编号全部错位,光是挨个改序号就能耗掉大半个下午。我前阵子帮人整理一份上百页的技…

2026/9/25 11:15:26 阅读更多 →
从第一个站到第二个站:独立开发者的静态网站选型与落地实践

从第一个站到第二个站:独立开发者的静态网站选型与落地实践

1. 项目概述1.1 核心需求解析做独立开发者这几年,说实话,第一个网站上线的那天晚上我兴奋得没睡着。但等它跑了半年,流量惨淡、功能臃肿、代码自己都懒得看第二遍之后,我才慢慢琢磨明白一个道理:第一个网站是练手&…

2026/9/25 20:29:09 阅读更多 →

月新闻

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能分类:[AI/大模型]细分主题:AI 增强型 CI/CD 流水线自动化与 GitOps 实践:Agent 工作流、工具调用与任务拆解:从原型到生产的验收清单很多团队在尝试用大…

2026/9/25 20:29:43 阅读更多 →
容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场分类:[工程技术]细分主题:Kubernetes 生产环境运维与排障实战:可复制的项目复盘模板与决策记录大部分团队的事故复盘报告,最后都变成了躺在 Confluence 或钉…

2026/9/25 20:29:31 阅读更多 →
容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步分类:[工程技术]细分主题:Docker 容器化技术与镜像安全管理:核心链路的逐步实现与关键代码取舍面对一个积累了五六年历史包袱的单体架构应用(包含 Web 接口、后台…

2026/9/25 19:27:26 阅读更多 →