计算运行时间传统写法
计算时间太短,运行时间为零,显然不符合要求
可以看到让函数停一秒后能显示加上睡眠时间的运行时间
原因是%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)
}
可以显示内存占用但是不能正确显示时间
直接使用基准测试
// 压测函数:测试函数运行平均耗时
func BenchmarkLengthOfLongestSubstring(b *testing.B) {
s := "abcabcbb" // 测试字符串
for i := 0; i < b.N; i++ {
lengthOfLongestSubstring(s) // 测试函数
}
}
现在可以看到时间了
附上所有代码
// 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) // 测试函数
}
}
运行时间和内存占用