golang buffer池子

使用buffer池子

// 声明buffer var numCalcsCreated int32
var numCalcsCreatedBuff int32
func CreateBuffer() interface{} {
	atomic.AddInt32(&numCalcsCreatedBuff, 1)
	return new(bytes.Buffer)
}

func BufferPool() *sync.Pool {
	// 创建实例
	return &sync.Pool{
		New: CreateBuffer,
	}
}



func Benchmark_byte_buffer(t *testing.B)  {
	// 声明一个 buffer
	t.StopTimer()

	bufferPool := BufferPool()
	// 启动的buff池子:1845,花销时间,10.92787875s
	//Benchmark_byte_buffer-8   	       1	10927927958 ns/op
	var ts  sync.WaitGroup
	t.StartTimer()
	start := time.Now()
	for i := 1; i<=100000000 ; i++{
		ts.Add(1)
		go func(i int ) {
			ts.Done()
			dataBuff := bufferPool.Get().(*bytes.Buffer)
			var lens uint64 // 占用8个字节

			// 将 int64 写入 buffer
			if err := binary.Write(dataBuff,binary.LittleEndian,uint64(i));err != nil {
				t.Log(err)
				return
			}

			lens = 5
			//将 int64 写入 buffer
			if err := binary.Write(dataBuff,binary.LittleEndian,lens);err != nil {
				t.Log(err)
				return
			}
			// data写入数据中 buffer 两个中文字占用6个字节
			if err := binary.Write(dataBuff,binary.LittleEndian,[]byte("你好"));err != nil {
				t.Log(err)
				return
			}

			byteRes := dataBuff.Bytes()
			dataBuff.Reset()
			bufferPool.Put(dataBuff)

			resI := binary.LittleEndian.Uint64(byteRes)
			_ = resI

		}(i)
		i++

	}

	ts.Wait()
	cost := time.Since(start)
	t.Logf("启动的buff池子:%d,花销时间,%v",numCalcsCreatedBuff,cost)

}

不使用buffer池子

func Benchmark_byte_no_buffer(t *testing.B)  {
	// 声明一个 buffer

	//启动的buff池子:0,花费时间:12.557962583s
	//Benchmark_byte_no_buffer-8   	       1	12558026000 ns/op

	t.StopTimer()
	var ts  sync.WaitGroup
	t.StartTimer()
	startNow := time.Now()
	for i := 1; i<=100000000 ; i++{
		ts.Add(1)
		go func(i int ) {
			ts.Done()
			dataBuff := new(bytes.Buffer)
			var lens uint64 // 占用8个字节
			// 将 int64 写入 buffer
			if err := binary.Write(dataBuff,binary.LittleEndian,uint64(i));err != nil {
				t.Log(err)
				return
			}

			lens = 5
			//将 int64 写入 buffer
			if err := binary.Write(dataBuff,binary.LittleEndian,lens);err != nil {
				t.Log(err)
				return
			}

			// data写入数据中 buffer 两个中文字占用6个字节
			if err := binary.Write(dataBuff,binary.LittleEndian,[]byte("你好"));err != nil {
				t.Log(err)
				return
			}
			byteRes := dataBuff.Bytes()
			resI := binary.LittleEndian.Uint64(byteRes)
			//t.Log(resI)
			_ = resI


		}(i)
		i++

	}

	ts.Wait()
	cost := time.Since(startNow)
	t.Logf("启动的buff池子:%d,花费时间:%v",numCalcsCreatedBuff,cost)

}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

gitxuzan_

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

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

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

打赏作者

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

抵扣说明:

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

余额充值