如何获取NASM汇编程序的运行时间?
测量NASM斐波那契程序运行时间的方法
要对比算法速度,你可以通过两种方式实现计时:直接在汇编代码中插入系统调用记录时间,或者用外部工具快速统计。
一、使用clock_gettime系统调用(高精度计时)
Linux下推荐用clock_gettime系统调用,它能提供纳秒级精度的时间戳。修改你的代码,在计算斐波那契数列的前后分别记录时间,最后计算时间差:
;fib_timer.asm global main extern printf section .data format: db "%20ld", 10, 0 time_fmt: db "Elapsed time: %ld ns", 10, 0 section .text main: push rbx ; 记录开始时间 mov rax, 228 ; x86_64 Linux下clock_gettime的系统调用号 mov rdi, 1 ; CLOCK_MONOTONIC_RAW,不受系统时间调整影响 lea rsi, [rsp-16] ; 栈上分配空间存储timespec结构体 syscall ; 原斐波那契计算逻辑 mov ecx, 90 xor rax, rax xor rbx, rbx inc rbx print: push rax push rcx mov rdi, format mov rsi, rax xor rax, rax call printf pop rcx pop rax mov rdx, rax mov rax, rbx add rbx, rdx dec ecx jnz print ; 记录结束时间 mov rax, 228 mov rdi, 1 lea rsi, [rsp-32] ; 栈上分配另一块空间存结束时间 syscall ; 计算时间差(结束时间 - 开始时间) mov rdx, [rsp-16] ; 开始秒数 mov rcx, [rsp-8] ; 开始纳秒数 mov r8, [rsp-32] ; 结束秒数 mov r9, [rsp-24] ; 结束纳秒数 sub r9, rcx ; 纳秒相减 jnc calc_done dec r8 add r9, 1000000000 calc_done: sub r8, rdx ; 秒数相减 imul r8, 1000000000 add r8, r9 ; 总耗时转成纳秒 ; 输出耗时 mov rdi, time_fmt mov rsi, r8 xor rax, rax call printf pop rbx ret
编译运行命令:
nasm -f elf64 fib_timer.asm -o fib_timer.o gcc fib_timer.o -o fib_timer ./fib_timer
注意:如果仅对比算法速度,建议去掉printf输出——IO操作的耗时远大于斐波那契计算本身,会干扰真实的算法性能对比。
二、使用外部time工具(快速便捷)
不需要修改原代码,直接用Linux的time命令运行程序,它会自动统计程序的运行时间:
# 编译原程序 nasm -f elf64 fib.asm -o fib.o gcc fib.o -o fib # 运行并计时 time ./fib
输出会包含三个时间值:
- real: 实际总耗时(包含IO等待、系统调度等额外耗时)
- user: 用户态代码运行耗时(最能反映算法本身的执行时间)
- sys: 内核态系统调用耗时
对比算法速度时,重点关注user时间即可。
内容的提问来源于stack exchange,提问作者VishalRashmika
相关产品推荐
相关产品推荐

