Glang测试算法运行时间、内存占用,解决运行时间为零

计算运行时间传统写法
image.png
计算时间太短,运行时间为零,显然不符合要求
在这里插入图片描述

可以看到让函数停一秒后能显示加上睡眠时间的运行时间

原因是%d以十进制输出,%v以默认格式输出,运行时间太短丢弃了一部分

解决方法:在包内新建测试文件main_test.go

定义测试函数

func TestAddTwoNumbers(t *testing.T) {
	// defer是逆序执行,在前面的后执行,先显示时间再显示内存占用
	defer memoryUsage(t)
	defer timeCost(time.Now(), t)
	
	// 构造测试数据
	l1 := intToListNode(342)
	l2 := intToListNode(465)
	expected := intToListNode(807)
	// 执行函数
	result := addTwoNumbers(l1, l2)
	// 检查结果是否符合预期
	if listNodeToInt(result) != listNodeToInt(expected) {
		t.Errorf("AddTwoNumbers(%v, %v) = %v; want %v", l1, l2, result, expected)
	}
}

// 耗时统计函数
func timeCost(start time.Time, t *testing.T) {
	tc := time.Since(start)
	t.Logf("time cost:%s\n", tc)
}

// 统计内存占用
func memoryUsage(t *testing.T) {
	var mem runtime.MemStats
	runtime.ReadMemStats(&mem)
	memUsage := float64(mem.Alloc) / (1024 * 1024)
	t.Logf("Memory usage for lengthOfLongestSubstring: %.4f MB", memUsage)
}

可以显示内存占用但是不能正确显示时间
image.png
直接使用基准测试

// 压测函数:测试函数运行平均耗时
func BenchmarkLengthOfLongestSubstring(b *testing.B) {
   s := "abcabcbb" // 测试字符串
   for i := 0; i < b.N; i++ {
      lengthOfLongestSubstring(s) // 测试函数
   }
}

现在可以看到时间了
image.png
附上所有代码

// main.go
func lengthOfLongestSubstring(s string) int {
   // 哈希集合,记录每个字符是否出现过
   m := map[byte]int{}
   n := len(s)
   // 右指针,初始值为 -1,相当于我们在字符串的左边界的左侧,还没有开始移动
   rk, ans := -1, 0
   for i := 0; i < n; i++ {
      if i != 0 {
         // 左指针向右移动一格,移除一个字符
         delete(m, s[i-1])
      }
      for rk+1 < n && m[s[rk+1]] == 0 {
         // 不断地移动右指针
         m[s[rk+1]]++
         rk++
      }
      // 第 i 到 rk 个字符是一个极长的无重复字符子串
      ans = max(ans, rk-i+1)
   }
   return ans
}

func max(x, y int) int {
   if x < y {
      return y
   }
   return x
}
// main_test.go
// 单元测试:测试函数是否正确计算最长不重复子串
func TestLengthOfLongestSubstring(t *testing.T) {
   // 测试函数的内存占用
   defer memoryUsage(t)
   testCases := []struct {
      s        string
      expected int
   }{
      {"abcabcbb", 3},
      {"bbbbb", 1},
      {"pwwkew", 3},
   }
   for _, test := range testCases {
      result := lengthOfLongestSubstring(test.s)
      if !reflect.DeepEqual(result, test.expected) {
         t.Errorf("lengthOfLongestSubstring(%v) = %v, want %v", test.s, result, test.expected)
      }
   }
}
// 统计内存占用
func memoryUsage(t *testing.T) {
   var mem runtime.MemStats
   runtime.ReadMemStats(&mem)
   memUsage := float64(mem.Alloc) / (1024 * 1024)
   t.Logf("Memory usage for lengthOfLongestSubstring: %.4f MB", memUsage)
}
// 压测函数:测试函数运行平均耗时
func BenchmarkLengthOfLongestSubstring(b *testing.B) {
   s := "abcabcbb" // 测试字符串
   for i := 0; i < b.N; i++ {
      lengthOfLongestSubstring(s) // 测试函数
   }
}

运行时间和内存占用
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

CCI344

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值