如何获取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
相关产品推荐
相关产品推荐

