丽江市网站建设_网站建设公司_RESTful_seo优化
2025/12/29 18:43:26 网站建设 项目流程

以下的simpleperf目录替换为自己的文件目录 我这里使用的都是绝对路径

常见 simpleperf 编译命令

#WINDDOWS SDK path
F:\Android\Sdk\ndk\29.0.14206865\toolchains\llvm\prebuilt\windows-x86_64\bin
# -g: 收集函数调用栈信息 -o 指定output文件  采集时间5s 采集的二进制文件
simpleperf record -g -o /data/local/tmp/rust_dir/perf.data --duration 5 ./cross_rust

查看 android 平台,选用适合的交叉编译

getprop ro.product.cpu.abi#模拟器 output
x86_64

为 rust 进行交叉编译(以 x86_64 为例子)

#临时镜像加速
#$env:RUSTUP_UPDATE_ROOT="https://mirrors.sjtug.sjtu.edu.cn/rust-static/rustup/"
#$env:RUSTUP_DIST_SERVER="https://mirrors.sjtug.sjtu.edu.cn/rust-static"
rustup target add x86_64-linux-android

检测当前编译链

#当前rust的交叉编译
rustup target list --installed# output
x86_64-linux-android
x86_64-pc-windows-msvc
# Android version
adb shell getprop ro.build.version.release# output
15#Android API LEVEL
adb shell getprop ro.build.version.sdk35

应该使用x86_64-linux-android35-clang的版本进行交叉

如何配置config.toml文件


# 对 ARM 64 位 (aarch64) Android 设备的配置[target.aarch64-linux-android]# 链接器路径修改为 aarch64 对应的文件
# 注意:你需要根据你的 NDK 版本和实际文件名称来调整路径
linker = "F:\\Android\\Sdk\\ndk\\29.0.14206865\\toolchains\\llvm\\prebuilt\\windows-x86_64\\bin\\aarch64-linux-android35-clang.cmd"# C 编译器(如果需要)
# cc = "F:\\Android\\Sdk\\ndk\\29.0.14206865\\toolchains\\llvm\\prebuilt\\windows-x86_64\\bin\\aarch64-linux-android35-clang.cmd"rustflags = ["-C", "link-arg=-target","-C", "link-arg=aarch64-unknown-linux-android35" # 目标也改为 aarch64
][target.x86_64-linux-android]# 链接器 (Linker) 的完整路径
# 注意:Windows NDK 工具链中的 clang 通常是一个 .cmd 或 .exe 文件。
# 我们使用 .cmd 文件,如果不行,请尝试使用 x86_64-linux-android-clang.exe
linker = "F:\\Android\\Sdk\\ndk\\29.0.14206865\\toolchains\\llvm\\prebuilt\\windows-x86_64\\bin\\x86_64-linux-android35-clang.cmd"# C 编译器 (CC) 的完整路径 (Rust 在编译 C/C++ 依赖时可能需要)
# cc = "F:\\Android\\Sdk\\ndk\\29.0.14206865\\toolchains\\llvm\\prebuilt\\windows-x86_64\\bin\\x86_64-linux-android35-clang.cmd"# 可选:指定 Android API 级别。35 是你路径中包含的版本
rustflags = ["-C", "link-arg=-target","-C", "link-arg=x86_64-unknown-linux-android35"
]

进行交叉编译的参数

#默认是debug 否则需要 ... build --release ...
cargo build --target x86_64-linux-android

FlameGprah.svg生成和导出的步骤

adb shell
cd /data/local/tmp/rust_dir#采集perf.data 保留符号 采集的名字叫做 perf.data 采集时间5s 对./cross_rust 可执行文件采集
simpleperf record -g -o /data/local/tmp/rust_dir/perf.data --duration 5 ./cross_rust#拉出来文件
adb pull /data/local/tmp/rust_dir/perf.data .```sh
adb shell
cd /data/local/tmp/rust_dir#拉出来文件
adb pull /data/local/tmp/rust_dir/perf.data .# 调用 ndk的simpleperf Python脚本
# -i 输入数据文件 -symfs 符号文件系统(Symbol File System) 用于解析地址到函数名
# --symfs 二进制文件所在目录
# FlameGraph的 stackcollapse-perf 脚本 读取调用栈数据,将相同的调用栈序列折叠
# 读取折叠后的堆栈信息和计数,生成SVG
# 导出svg
python F:\Android\Sdk\ndk\29.0.14206865\simpleperf\report_sample.py -i perf.data --symfs D:\code\doc_for_harmony_project\filament\rust_test\target\x86_64-linux-android\debug | perl D:\code\FlameGraph\stackcollapse-perf.pl | perl D:\code\FlameGraph\flamegraph.pl > test_root.svg

cross_rustrs文件和对crross_rust的调用链的解释

cross_rust.rs

级别 函数/方法 结构体/模块 职责描述
Level 0 main() main.rs 程序的起点,负责协调整个流程。
Level 1 Graph::new() Graph 初始化图结构体及其所有内部数组和向量。
Level 1 Graph::build_with_sample_data() Graph 构建图:定义节点数,并读取内置的边数据。
Level 2 Graph::add_edge() (多次) Graph 根据边数据,向图的邻接表中添加边(双向)。
Level 1 Graph::prim() Graph 执行 Prim 算法:寻找最小生成树的核心逻辑。
Level 2 BinaryHeap::new() std::collections 初始化优先队列。
Level 2 BinaryHeap::push() std::collections 将起始节点推入优先队列。
Level 2 BinaryHeap::pop() (循环内) std::collections 取出权值最小的边。
Level 2 self.tt.push() (条件满足时) Graph 将找到的 MST 边记录到结果集合中。
Level 1 Graph::print_mst_edges() (条件满足时) Graph 输出结果:格式化打印 MST 的所有边。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询