编程语言编译器语言运行时标准库开发工具【免费下载链接】sdkThe Dart SDK, including the VM, JS and Wasm compilers, analysis, core libraries, and more.项目地址https://gitcode.com/gh_mirrors/sdk1/sdk点击查看免费下载本文以 Dart SDK 仓库中的 benchmarks/FfiCall/native/README.md 为核心骨架结合其配套的Makefile、cipd.yaml、native_functions.c以及 Dart 侧基准源码完整讲解FfiCall基准测试所需原生动态库的构建、多架构产物组织、CIPD 包上传与 DEPS 哈希更新流程。读完本文你将掌握如何在 Dart SDK 仓库内重新构建并发布一套 FFI 基准测试原生库也能理解其背后的dart:ffi加载机制与基准测试驱动方式。一、FfiCall 基准测试的整体结构benchmarks/FfiCall是 Dart SDK 中用于衡量「Dart 与 C 原生代码相互调用FFI开销」的微基准集合目录结构如下benchmarks/FfiCall/ ├── dart/ │ ├── FfiCall.dart # 基准测试主驱动 │ ├── benchmark_generated.dart # 由生成器产出的基准类勿手改 │ └── dlopen_helper.dart # 跨平台动态库加载辅助 ├── native/ │ ├── Makefile # 多架构动态库构建脚本 │ ├── README.md # 发布流程说明本文主体 │ ├── cipd.yaml # CIPD 包定义 │ └── native_functions.c # 被测 C 函数集合 └── generate_benchmarks.dart # 基准代码生成器Dart 侧基准逻辑位于 benchmarks/FfiCall/dart/FfiCall.dart原生 C 函数库位于 benchmarks/FfiCall/native/native_functions.c基准类由 benchmarks/FfiCall/generate_benchmarks.dart 自动生成到dart/benchmark_generated.dart。二、原生库的职责被测 C 函数集合native_functions.c提供了一组规则统一、便于量化对比的 C 函数覆盖 FFI 基准所需的全部类型维度整型uint8_t/uint16_t/uint32_t/uint64_t与int8_t/int16_t/int32_t/int64_t例如Function1Int32(int32_t x)返回x 42浮点float/double如Function20Double(...)对 20 个参数求和指针uint8_t *系列如Function1PointerUint8返回a 1句柄void*系列如Function1Handle(void* a)原样返回a。每个类型都提供了参数个数为 1、2、4、10、20 的变体用于度量「参数数量增长对 FFI 调用开销的影响」。对应的生成规则定义在 benchmarks/FfiCall/generate_benchmarks.dart 的generateFor配置中const generateFor { Int8: [1], Int32: [1, 2, 4, 10, 20], Int64: [1, 2, 4, 10, 20], Float: [1, 2, 4, 10, 20], Double: [1, 2, 4, 10, 20], PointerUint8: [1, 2, 4, 10, 20], Handle: [1, 2, 4, 10, 20], };三、Makefile多架构动态库构建发布流程的第一步是构建动态库。native/Makefile通过交叉编译产出 4 个 Linux 架构产物并为 Apple SiliconM1提供 macOS 目标架构编译器变量产物路径Linux x64CCgccout/linux/x64/libnative_functions.soLinux ia32CCgcc -m32out/linux/ia32/libnative_functions.soLinux arm64CCARM64aarch64-linux-gnu-gccout/linux/arm64/libnative_functions.soLinux armCCARMarm-linux-gnueabihf-gccout/linux/arm/libnative_functions.somacOS arm64CCgccout/mac/arm64/libnative_functions.dylib统一编译参数为CFLAGS-Wall -g -O -fPIC其中-fPIC是生成位置无关代码、供dlopen动态加载的必需选项。Makefile 顶部注释TODO(37531)说明当前仍由 Makefile 构建待基准运行器支持后计划改用 SDK 构建因此该文件属于阶段性过渡方案。四、CIPD 发布流程原文档核心步骤原 benchmarks/FfiCall/native/README.md 给出的完整发布流程如下每一步都需要严格执行$ cd benchmarks/FfiCall/native $ make $ find . -name *.o -type f -delete $ cipd create -pkg-defcipd.yaml各步骤含义make按第三节表格构建全部目标架构的动态库find . -name *.o -type f -delete删除中间目标文件避免中间产物被误打包进 CIPD 包最终产物只有各架构的.so/.dylibcipd create -pkg-defcipd.yaml依据cipd.yaml定义创建并上传 CIPD 包。cipd.yaml 包定义说明benchmarks/FfiCall/native/cipd.yaml 内容如下package: dart/benchmarks/fficall description: Dynamic libaries for running the benchmarks/FfiCall. install_mode: copy data: - dir: out/packageCIPD 包名固定为dart/benchmarks/fficallinstall_mode: copy安装时以复制方式落盘而非符号链接保证基准运行时可稳定定位动态库data将out/目录整体作为包数据。Makefile 中同样内置了一条等效命令cipd目标cipd create -name dart/benchmarks/fficall -in out -install-mode copy效果与-pkg-def方式等价二者可互换使用。五、更新 DEPS 中的版本哈希上传成功后需要把新的实例哈希写回仓库根目录的 DEPS 文件。原文档给出的查询命令$ cipd instances dart/benchmarks/fficall该命令会列出该包的历史实例及对应哈希含时间戳与refs取最新一条的实例哈希替换 DEPS 中dart/benchmarks/fficall条目下的version字段。DEPS 中 CIPD 依赖的通用结构如下以third_party/d8为例benchmarks/fficall的条目采用同样模式{ package: dart/benchmarks/fficall, version: 替换为 cipd instances 输出的新哈希, dep_type: cipd }关于 CIPD 版本管理方式DEPS 中已有的sdk_tag: version:3.14.0-226.0.dev见 DEPS 第 58 行等条目说明CIPD 依赖既可以锁定为具体实例哈希也可以通过ref或版本标签引用。更新哈希后需同步提交 DEPS 变更构建与测试基础设施才能在gclient sync时拉取到新版本的原生库。六、Dart 侧如何加载并调用这些动态库平台相关的加载路径benchmarks/FfiCall/dart/dlopen_helper.dart 负责按当前平台与 CPU 架构拼接动态库路径macOS/iOS →mac/arch/libname.dylibWindows →win/arch/name.dll其余Linux/Android→linux/arch/libname.so架构通过uname -m探测并将arm64/aarch64/x86_64等名称归一化同时利用sizeOfIntPtr()检测 32 位运行模式将 x64/arm64 映射回ia32/arm目录从而与 Makefile 产出的目录结构精确对应。基准主文件 benchmarks/FfiCall/dart/FfiCall.dart 中按如下方式加载DynamicLibrary ffiTestFunctions dlopenPlatformSpecific( native_functions, path: Platform.script.resolve(../native/out/).path, );两种调用路径lookupFunction 与 NativeFfiCall.dart同时度量两种 FFI 调用方式动态查找lookupFunction通过DynamicLibrary.lookupFunctionNativeFunction1Int64, Function1int(Function1Int64)在运行时按符号名解析并调用覆盖经典的dart:ffi路径静态 NativeNative注解 FfiNativeResolver生成器在 benchmarks/FfiCall/generate_benchmarks.dart 中为每个函数生成带Native...(symbol: FunctionNType, isLeaf: ...)注解的external声明由 VM 通过符号解析直接绑定是 Dart FFI 的高效绑定方式。每种基准还区分isLeaf: true/false用于度量「告知编译器不回调 Dartleaf时的调用开销差异」。main()末尾还通过dlopenGlobalPlatformSpecific以RTLD_LAZY | RTLD_GLOBAL全局方式预加载动态库确保符号在进程内全局可见。基准结果校验由FfiBenchmarkBase提供expectEquals/expectApprox/expectIdentical完成如整型基准断言x 0x7FFFFFFF00000000 N * 42。重新生成基准代码若需要新增类型或参数个数变体可修改generateFor/nativeToDartType配置后运行$ dart benchmarks/FfiCall/generate_benchmarks.dart脚本会把生成结果写入dart/benchmark_generated.dart并自动执行dart format。生成的 Dart 代码以part of FfiCall.dart方式内联见 benchmarks/FfiCall/dart/benchmark_generated.dart 头部注释目的是让库 URI 与主文件保持一致从而保证FfiNativeResolver对主文件 URI 的正常解析。七、完整发布工作流总结综合原文档与仓库源码一次完整的「修改原生函数 → 发布新版」流程为# 1. 修改 native_functions.c或 Makefile 新增架构 $ cd benchmarks/FfiCall/native # 2. 构建全部目标架构动态库 $ make # 3. 清理中间 .o确保只打包最终产物 $ find . -name *.o -type f -delete # 4. 依据 cipd.yaml 创建并上传 CIPD 包 $ cipd create -pkg-defcipd.yaml # 5. 查询最新实例哈希 $ cipd instances dart/benchmarks/fficall # 6. 将 DEPS 中 dart/benchmarks/fficall 的 version 更新为新哈希并提交八、注意事项与边界说明适用平台当前cipd.yaml打包的out/目录内容由 Makefile 产出覆盖 Linuxx64/ia32/arm64/arm与 macOS arm64Windows 路径win/目录在dlopen_helper.dart中已预留但需自行补充对应构建产物编译器依赖交叉编译 arm/arm64 依赖arm-linux-gnueabihf-gcc与aarch64-linux-gnu-gcc工具链DEPS 变更影响更新 DEPS 哈希后所有通过gclient同步该仓库的构建/测试机器会拉取新原生库因此发布前应先在本地完整运行一次FfiCall基准dart benchmarks/FfiCall/dart/FfiCall.dart可通过首个参数按名称过滤基准项验证正确性阶段性方案Makefile 顶部标注的TODO(37531)表明该构建方式未来可能被 SDK 内建构建替换关注该注释的后续变更即可。通过上述流程你可以像 Dart SDK 维护者一样把更新后的 FFI 基准原生库安全、可复现地发布到 CIPD 并回写 DEPS为 Dart 团队持续跟踪 FFI 调用性能提供一致的基础设施支撑。赞分享编程语言编译器语言运行时标准库开发工具【免费下载链接】sdkThe Dart SDK, including the VM, JS and Wasm compilers, analysis, core libraries, and more.项目地址https://gitcode.com/gh_mirrors/sdk1/sdk点击查看免费下载相关推荐Dart SDK 基准测试原生库 CIPD 发布指南以 FfiCallback 为例Dart SDK 基准测试原生库 CIPD 发布指南以 FfiCallback 为例 本指南以 Dart SDK 仓库中的 benchmarks/FfiCal编程语言编译器语言运行时标准库开发工具Solana 聚合仓库实战指南环境准备、构建、测试、基准测试、代码覆盖与发布流程Solana 聚合仓库实战指南环境准备、构建、测试、基准测试、代码覆盖与发布流程 本文基于 Solana 仓库根目录的 README https://link区块链后端分布式系统Bluebird 贡献开发指南构建、测试与基准测试全流程解析Bluebird 贡献开发指南构建、测试与基准测试全流程解析 本篇指南基于 Bluebird 官方 贡献指南 https://link.gitcode.com后端创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
企业数字化 ERP 产品动态
相关推荐
时间核对面试必问的3个深坑,别等挂了才懂 时间核对面试必问的3个深坑,别等挂了才懂 翻开官方开发者文档找时间核对的规范,页面一拉到底全是 RFC 标准术语和时区偏移计算,根本抓不住重点。但面试官问起“如何保证分布式系统时间一致”时,你背不出那两行核心逻辑,直接就凉半截。这绝对是面试… · 2026/9/23 18:43:35
用 Skia 构建最小 iOS Metal 应用:编译流程与 Ganesh 渲染管线源码解析 图形学 【免费下载链接】skia Skia is a complete 2D graphic library for drawing Text, Geometries, and Images. See documentation for contribution instructions. 项目地址: https://gitcode.com/gh_mirrors/ski/skia 点击查看 免费下载 本指南以仓库中的 ex… · 2026/9/23 18:43:29
MySQL性能分析实战:从慢查询日志到EXPLAIN索引优化 数据库一旦慢下来,业务侧最先感受到的就是接口超时、页面转圈、报表出不来。很多人第一反应是“加索引”“换硬件”“上缓存”,但真正动手做MySQL性能分析时,才发现连从哪儿下手都不知道。我这些年处理过的线上故障,绝大多数根因并… · 2026/9/23 19:22:25
JavaWeb停车场管理系统实战:从数据库到并发优化 简介:基于JavaWeb的停车场管理系统课程设计资源包,面向需要完成相关大作业或课设的在校生,提供从源码到报告的全套方案。系统覆盖管理员登录、停车记录查看与修改、停车场使用情况及数据统计、预计收入查看,以及车辆驶入驶出结算、… · 2026/9/23 19:22:19
Akka Streams conflate 操作符详解:用聚合消化背压,让快上游与慢下游解耦 Akka Streams conflate 操作符详解:用聚合消化背压,让快上游与慢下游解耦 【免费下载链接】akka-core A platform to build and run apps that are elastic, agile, and resilient. SDK, libraries, and hosted environments. 项目地址: https://gitco… · 2026/9/23 19:22:19
C语言数组与指针核心辨析:数组退化、内存布局与工程实践指南 1. 数组和指针:一对总被误解的“双胞胎”1.1 数组名不是指针,但为什么大家都这么说先问一个基础问题:数组和指针是一回事吗?答案是不,但很多人学完依然分不清。原因很现实——在绝大多数使用场景里,数组名和… · 2026/9/23 19:22:19
16通道DAT文件分离实战:工业传感器原始数据解析 简介:这是一套面向信号处理初学者与嵌入式数据采集工程师的16通道DAT文件分离工具,专为简化多传感器同步采集数据的后处理流程而设计。资源解决实际项目中常见的多通道数据混存问题,支持将单个16通道DAT原始数据按通道拆解为独立数据单元&… · 2026/9/23 19:22:19
aiohttp异步HTTP实战:从协程原理到并发爬虫与API服务 提到异步HTTP框架,很多人的第一反应是“这东西我暂时用不上”——这很正常,因为我以前也是这么想的。翻了翻这两年写的爬虫和接口服务,真正卡住我的几乎都是同一个问题:某个环节需要等网络IO,程序却被同步逻辑拖得死死… · 2026/9/23 19:22:19
3招搞定手机怎么下载微信面试难题实战项目解析 3招搞定手机怎么下载微信面试难题实战项目解析 面试被问“手机怎么下载微信”背后的原理,90%的人答不上来。别笑,这看似弱智的问题,实则是考察你对移动应用分发机制、安全校验及网络协议理解的试金石。我带过不少校招新人,他们背了八股文,却连一个A… · 2026/9/23 0:00:03
你有新短消息请注意查收:3个新手避坑指南搞定消息系统选型 你有新短消息请注意查收:3个新手避坑指南搞定消息系统选型 面试被问“高并发下如何保证消息不丢失”,你张口就是“用Redis”,结果面试官追问“如果Redis宕机了怎么办”,你瞬间卡壳。这种场景太常见了,很多新手在背八股文时,只记住了技术名词… · 2026/9/23 0:00:29