You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何获取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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 05:17:35