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

133 阅读2分钟

计算运行时间传统写法 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) // 测试函数
   }
}

运行时间和内存占用 image.png