分享
  1. 首页
  2. 文章

Golang pipline泛型管道和类型管道的性能差距

FredricZhu · · 1293 次点击 · · 开始浏览
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

pips/generic.go

//generic
package pips
type Generic struct {
}
func NewGeneric() *Generic {
 generic := &Generic{}
 return generic
}
func (generic *Generic) Repeat(
 done <-chan interface{},
 args ...interface{},
) <-chan interface{} {
 valueStream := make(chan interface{})
 go func() {
 defer close(valueStream)
 for {
 for _, v := range args {
 select {
 case <-done:
 return
 case valueStream <- v:
 }
 }
 }
 }()
 return valueStream
}
func (generic *Generic) Take(
 done <-chan interface{},
 valueStream <-chan interface{},
 num int,
) <-chan interface{} {
 takeStream := make(chan interface{})
 go func() {
 defer close(takeStream)
 for i := 0; i < num; i++ {
 select {
 case <-done:
 return
 case takeStream <- <-valueStream:
 }
 }
 }()
 return takeStream
}
func (generic *Generic) ToString(
 done <-chan interface{},
 valueStream <-chan interface{},
) <-chan string {
 stringStream := make(chan string)
 go func() {
 defer close(stringStream)
 for i := range valueStream {
 select {
 case <-done:
 return
 case stringStream <- i.(string):
 }
 }
 }()
 return stringStream
}

pips/typed.go

// typed
package pips
type Typed struct {
}
func NewTyped() *Typed {
 typed := &Typed{}
 return typed
}
func (typed *Typed) Repeat(
 done <-chan interface{},
 args ...string,
) <-chan string {
 valueStream := make(chan string)
 go func() {
 defer close(valueStream)
 for {
 for _, v := range args {
 select {
 case <-done:
 return
 case valueStream <- v:
 }
 }
 }
 }()
 return valueStream
}
func (typed *Typed) Take(
 done <-chan interface{},
 valueStream <-chan string,
 num int,
) <-chan string {
 takeStream := make(chan string)
 go func() {
 defer close(takeStream)
 for i := 0; i < num; i++ {
 select {
 case <-done:
 return
 case takeStream <- <-valueStream:
 }
 }
 }()
 return takeStream
}

pipline4_test.go

package main
import (
 pips "pipline4/pips"
 "testing"
)
func BenchmarkGeneric(b *testing.B) {
 generic := pips.NewGeneric()
 done := make(chan interface{})
 defer close(done)
 b.ResetTimer()
 for range generic.ToString(done, generic.Take(done, generic.Repeat(done, "a"), b.N)) {
 }
}
func BenchmarkTyped(b *testing.B) {
 typed := pips.NewTyped()
 done := make(chan interface{})
 defer close(done)
 b.ResetTimer()
 for range typed.Take(done, typed.Repeat(done, "a"), b.N) {
 }
}

运行结果如下图所示,表明泛型管道和类型管道的性能差距大概在 50%。也就是700ms左右,几乎可以忽略不记。

image.png

有疑问加站长微信联系(非本文作者)

本文来自:简书

感谢作者:FredricZhu

查看原文:Golang pipline泛型管道和类型管道的性能差距

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

关注微信
1293 次点击
暂无回复
添加一条新回复 (您需要 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传

用户登录

没有账号?注册
(追記) (追記ここまで)

今日阅读排行

    加载中
(追記) (追記ここまで)

一周阅读排行

    加载中

关注我

  • 扫码关注领全套学习资料 关注微信公众号
  • 加入 QQ 群:
    • 192706294(已满)
    • 731990104(已满)
    • 798786647(已满)
    • 729884609(已满)
    • 977810755(已满)
    • 815126783(已满)
    • 812540095(已满)
    • 1006366459(已满)
    • 692541889

  • 关注微信公众号
  • 加入微信群:liuxiaoyan-s,备注入群
  • 也欢迎加入知识星球 Go粉丝们(免费)

给该专栏投稿 写篇新文章

每篇文章有总共有 5 次投稿机会

收入到我管理的专栏 新建专栏