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

如何获取MIPS汇编程序运行时间?算法性能对比项目求助

可行解决方案:Java与MIPS汇编算法运行时间对比

方案1:手动指令计数(适配现有代码)

直接在汇编代码里只统计算法核心逻辑的指令数,排除输入输出等系统调用(IO耗时属于模拟器本身,和算法无关)。注意:

  • 默认用单周期MIPS模型,每条指令计1个周期;如果需要流水线模型,要额外计算分支延迟、load-use冲突等周期开销(比如分支失败会多1周期延迟)
  • 修正现有代码的变量冲突问题(比如原代码用$t4同时存初始周期和斐波那契计算值),把计时变量和算法变量彻底分开

修正后的斐波那契核心计数代码示例:

.data
fibonacciLabel: .asciiz "Fibonacci sequence: "
enterLabel: .asciiz "Enter a number to calculate its Fibonacci sequence: "
cycleLabel: .asciiz "Execution time in cycles: "
space: .asciiz " "      
newline: .asciiz "\n"

.text
.globl main
main:
    # 输入输出部分(不计入算法计时)
    li $v0, 4
    la $a0, enterLabel
    syscall
    li $v0, 5
    syscall
    move $t0, $v0       # 保存用户输入的n到$t0

    li $v0, 4
    la $a0, fibonacciLabel
    syscall
    li $t1, 0           # F(0)
    li $t2, 1           # F(1)
    move $a0, $t1
    li $v0, 1
    syscall
    li $v0,4
    la $a0,space
    syscall
    move $a0,$t2
    li $v0,1
    syscall

    # 初始化周期计数器(仅统计核心算法)
    li $t9, 0           # 单周期模型下,每条指令计1周期

    # 核心算法开始计时
    li $t3, 2
    ble $t0, 1, endLoop # n<=1时直接结束循环
loop:
    add $t4, $t1, $t2   # 计算下一个斐波那契数
    addi $t9, $t9, 1    # 计数该指令周期

    move $t1, $t2       # 更新前一个数
    addi $t9, $t9, 1
    move $t2, $t4       # 更新当前数
    addi $t9, $t9, 1

    addi $t3, $t3, 1    # 循环计数器+1
    addi $t9, $t9, 1

    bge $t3, $t0, endLoop # 判断循环结束条件
    addi $t9, $t9, 1    # 计数分支指令周期

    j loop              # 跳转回循环开头
    addi $t9, $t9, 1

    # 打印新数(不计入核心算法计时,若需统计则添加计数)
    li $v0,4
    la $a0,space
    syscall
    move $a0,$t4
    li $v0,1
    syscall
endLoop:
    # 输出统计结果
    li $v0,4
    la $a0,newline
    syscall
    li $v0,4
    la $a0,cycleLabel
    syscall
    move $a0,$t9
    li $v0,1
    syscall
    li $v0,4
    la $a0,newline
    syscall

    li $v0,10
    syscall

方案2:用MARS内置指令统计工具

MARS其实自带指令统计功能,不用改代码就能快速获取数据:

  • 运行程序后,点击顶部菜单栏 Tools -> Instruction Statistics
  • 弹出窗口会显示总指令数、各类型指令(如add、branch)的执行次数,结合单周期模型直接换算成总周期;如果要更精准的流水线周期,可查MIPS流水线规则计算额外开销

方案3:Java计时与MIPS周期换算

Java端精确计时,MIPS端用指令数估算时间,然后对比:

  • Java代码里用System.nanoTime()包裹算法核心逻辑(排除IO),比如:
    long start = System.nanoTime();
    fibonacci(n); // 只调用斐波那契计算函数
    long end = System.nanoTime();
    System.out.println("Java execution time: " + (end - start) + "ns");
    
  • MIPS端统计核心算法的指令数,乘以目标MIPS架构的时钟周期(比如3GHz的MIPS,1周期≈0.33ns),得到估算时间后和Java的实际时间对比

方案4:脚本批量自动化统计

如果要测试多个算法、多个输入规模,用脚本提高效率:

  • MARS支持命令行模式,用mars sm yourcode.asm运行代码,重定向输出到文件,提取指令计数结果
  • Java用脚本循环调用,记录不同输入下的运行时间
  • 最后把数据整理成对比表格,快速完成项目报告

内容的提问来源于stack exchange,提问作者Wajdy Elsobky

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 11:25:54