当前位置: 首页 > article >正文

手写Golang泛型栈和队列的库函数

代码获取:

go get -u github.com/xzhHas/tools@latest 

栈和队列我分别使用了切片和list实现,具体性能是切片比较高。
以下是压测案例:
在这里插入图片描述

代码测试:

package main

import (
	"fmt"
	"github.com/xzhHas/tools/queue"
	"github.com/xzhHas/tools/stack"
	"testing"
)

type CustomStruct struct {
	ID   int
	Name string
	Age  int
	Sex  bool
	Data []byte
}

func BenchmarkStackAndQueue(b *testing.B) {
	// 测试 int 类型
	b.Run("TestIntStack", func(b *testing.B) {
		s1 := stack.NewStackArray[int]()
		b.ResetTimer() // 重置计时器,防止初始化时间被计算进来
		for i := 0; i < 100000; i++ {
			s1.Push(i)
		}

		// 测试栈顶元素
		for i := 0; i < 100000; i++ {
			_, _ = s1.Peek() // 获取栈顶元素
		}

		for i := 0; i < 100000; i++ {
			_, _ = s1.Pop()
		}
	})

	b.Run("TestIntStackList", func(b *testing.B) {
		s2 := stack.NewStackList[int]()
		b.ResetTimer()
		for i := 0; i < 100000; i++ {
			s2.Push(i)
		}

		// 测试栈顶元素
		for i := 0; i < 100000; i++ {
			_, _ = s2.Peek() // 获取栈顶元素
		}

		for i := 0; i < 100000; i++ {
			_, _ = s2.Pop()
		}
	})

	b.Run("TestIntQueueArray", func(b *testing.B) {
		q4 := queue.NewQueueArray[int]()
		b.ResetTimer()
		for i := 0; i < 100000; i++ {
			q4.Enqueue(i)
		}

		// 测试队列头尾元素
		for i := 0; i < 100000; i++ {
			_, _ = q4.Front() // 获取队列头部元素
			_, _ = q4.Back()  // 获取队列尾部元素
		}

		for i := 0; i < 100000; i++ {
			_, _ = q4.Dequeue()
		}
	})

	b.Run("TestIntQueueList", func(b *testing.B) {
		q3 := queue.NewQueueList[int]()
		b.ResetTimer()
		for i := 0; i < 100000; i++ {
			q3.Enqueue(i)
		}

		// 测试队列头尾元素
		for i := 0; i < 100000; i++ {
			_, _ = q3.Front() // 获取队列头部元素
			_, _ = q3.Back()  // 获取队列尾部元素
		}

		for i := 0; i < 100000; i++ {
			_, _ = q3.Dequeue()
		}
	})

	// 测试 string 类型
	b.Run("TestStringStack", func(b *testing.B) {
		s1 := stack.NewStackArray[string]()
		b.ResetTimer()
		for i := 0; i < 100000; i++ {
			s1.Push(fmt.Sprintf("string-%d", i))
		}

		// 测试栈顶元素
		for i := 0; i < 100000; i++ {
			_, _ = s1.Peek() // 获取栈顶元素
		}

		for i := 0; i < 100000; i++ {
			_, _ = s1.Pop()
		}
	})

	b.Run("TestStringStackList", func(b *testing.B) {
		s2 := stack.NewStackList[string]()
		b.ResetTimer()
		for i := 0; i < 100000; i++ {
			s2.Push(fmt.Sprintf("string-%d", i))
		}

		// 测试栈顶元素
		for i := 0; i < 100000; i++ {
			_, _ = s2.Peek() // 获取栈顶元素
		}

		for i := 0; i < 100000; i++ {
			_, _ = s2.Pop()
		}
	})

	b.Run("TestStringQueueArray", func(b *testing.B) {
		q4 := queue.NewQueueArray[string]()
		b.ResetTimer()
		for i := 0; i < 100000; i++ {
			q4.Enqueue(fmt.Sprintf("string-%d", i))
		}

		// 测试队列头尾元素
		for i := 0; i < 100000; i++ {
			_, _ = q4.Front() // 获取队列头部元素
			_, _ = q4.Back()  // 获取队列尾部元素
		}

		for i := 0; i < 100000; i++ {
			_, _ = q4.Dequeue()
		}
	})

	b.Run("TestStringQueueList", func(b *testing.B) {
		q3 := queue.NewQueueList[string]()
		b.ResetTimer()
		for i := 0; i < 100000; i++ {
			q3.Enqueue(fmt.Sprintf("string-%d", i))
		}

		// 测试队列头尾元素
		for i := 0; i < 100000; i++ {
			_, _ = q3.Front() // 获取队列头部元素
			_, _ = q3.Back()  // 获取队列尾部元素
		}

		for i := 0; i < 100000; i++ {
			_, _ = q3.Dequeue()
		}
	})

	// 测试自定义结构体类型
	b.Run("TestCustomStructStack", func(b *testing.B) {
		s1 := stack.NewStackArray[CustomStruct]()
		b.ResetTimer()
		for i := 0; i < 100000; i++ {
			s1.Push(CustomStruct{ID: i, Name: fmt.Sprintf("custom-%d", i)})
		}

		// 测试栈顶元素
		for i := 0; i < 100000; i++ {
			_, _ = s1.Peek() // 获取栈顶元素
		}

		for i := 0; i < 100000; i++ {
			_, _ = s1.Pop()
		}
	})

	b.Run("TestCustomStructStackList", func(b *testing.B) {
		s2 := stack.NewStackList[CustomStruct]()
		b.ResetTimer()
		for i := 0; i < 100000; i++ {
			s2.Push(CustomStruct{ID: i, Name: fmt.Sprintf("custom-%d", i)})
		}

		// 测试栈顶元素
		for i := 0; i < 100000; i++ {
			_, _ = s2.Peek() // 获取栈顶元素
		}

		for i := 0; i < 100000; i++ {
			_, _ = s2.Pop()
		}
	})

	b.Run("TestCustomStructQueueArray", func(b *testing.B) {
		q4 := queue.NewQueueArray[CustomStruct]()
		b.ResetTimer()
		for i := 0; i < 100000; i++ {
			q4.Enqueue(CustomStruct{ID: i, Name: fmt.Sprintf("custom-%d", i)})
		}

		// 测试队列头尾元素
		for i := 0; i < 100000; i++ {
			_, _ = q4.Front() // 获取队列头部元素
			_, _ = q4.Back()  // 获取队列尾部元素
		}

		for i := 0; i < 100000; i++ {
			_, _ = q4.Dequeue()
		}
	})

	b.Run("TestCustomStructQueueList", func(b *testing.B) {
		q3 := queue.NewQueueList[CustomStruct]()
		b.ResetTimer()
		for i := 0; i < 100000; i++ {
			q3.Enqueue(CustomStruct{ID: i, Name: fmt.Sprintf("custom-%d", i)})
		}

		// 测试队列头尾元素
		for i := 0; i < 100000; i++ {
			_, _ = q3.Front() // 获取队列头部元素
			_, _ = q3.Back()  // 获取队列尾部元素
		}

		for i := 0; i < 100000; i++ {
			_, _ = q3.Dequeue()
		}
	})
}

http://www.kler.cn/a/387482.html

相关文章:

  • 15 个改变世界的开源项目:塑造现代技术的先锋力量
  • redis实现消息队列的几种方式
  • OpenEuler 下 Docker 安装、配置与测试实例
  • 【Vue】Vue3.0(二十二) v-model 在原始Dom元素、自定义输入组件中双向绑定的底层实现原理详解
  • IntelliJ IDEA的快捷键
  • 用接地气的例子趣谈 WWDC 24 全新的 Swift Testing 入门(三)
  • 万字长文解读深度学习——卷积神经网络CNN
  • JS | JS中获得鼠标位置的属性有哪些?
  • 【ShuQiHere】️`adb kill-server` 和 `adb start-server` 命令的作用
  • 如何自定义一个函数有strlen的功能(不创建新的临时变量)(c基础)
  • 机器学习系列----岭回归(Ridge Regression)简介及实现
  • 【复平面】-复数相乘的几何性质
  • 从0开始深度学习(28)——序列模型
  • 在 CIFAR10 数据集上训练 Vision Transformer (ViT)
  • 解释一下Java中的异常处理机制
  • IDM扩展添加到Edge浏览器
  • 怎么给llama3.2-vision:90b模型进行量化剪枝蒸馏
  • 类加载的生命周期?
  • opencv实时弯道检测
  • 1.6K+ Star!Ichigo:一个开源的实时语音AI项目
  • 华为机试HJ29 字符串加解密
  • SDL打开YUV视频
  • AI和大模型技术在网络脆弱性扫描领域的最新进展与未来发展趋势
  • [C++ 核心编程]笔记 4.4.3 成员函数做友元
  • <<零基础C++第一期, C++入门基础>>
  • 打造完整 Transformer 编码器:逐步实现高效深度学习模块