文章目录

  • 1. 测试代码
  • 2. 结论
  • 3. 知识点

1. 测试代码

func main() {type Buffer struct {sb bytes.Buffer// 线程锁rw sync.RWMutex// 等待线程运行完毕wg sync.WaitGroup}var buffer Buffernow := time.Now()for i := 0; i < 1000000; i++ {// 官方推荐用法buffer.wg.Add(1)go func() {// 加锁buffer.rw.Lock()// 运行完解锁defer buffer.rw.Unlock()buffer.sb.WriteString("壬戌之秋,七月既望,苏子与客泛舟游于赤壁之下。清风徐来,水波不兴。举酒属客,诵明月之诗,歌窈窕之章。少焉,月出于东山之上,徘徊于斗牛之间。白露横江,水光接天。纵一苇之所如,凌万顷之茫然。浩浩乎如冯虚御风,而不知其所止;飘飘乎如遗世独立,羽化而登仙。")buffer.sb.WriteString("于是饮酒乐甚,扣舷而歌之。歌曰:“桂棹兮兰桨,击空明兮溯流光。渺渺兮予怀,望美人兮天一方。”客有吹洞箫者,倚歌而和之。其声呜呜然,如怨如慕,如泣如诉,余音袅袅,不绝如缕。舞幽壑之潜蛟,泣孤舟之嫠妇。")buffer.sb.WriteString("苏子愀然,正襟危坐而问客曰:“何为其然也?”客曰:“月明星稀,乌鹊南飞,此非曹孟德之诗乎?西望夏口,东望武昌,山川相缪,郁乎苍苍,此非孟德之困于周郎者乎?方其破荆州,下江陵,顺流而东也,舳舻千里,旌旗蔽空,酾酒临江,横槊赋诗,固一世之雄也,而今安在哉?况吾与子渔樵于江渚之上,侣鱼虾而友麋鹿,驾一叶之扁舟,举匏樽以相属。寄蜉蝣于天地,渺沧海之一粟。哀吾生之须臾,羡长江之无穷。挟飞仙以遨游,抱明月而长终。知不可乎骤得,托遗响于悲风。”")buffer.sb.WriteString("苏子曰:“客亦知夫水与月乎?逝者如斯,而未尝往也;盈虚者如彼,而卒莫消长也。盖将自其变者而观之,则天地曾不能以一瞬;自其不变者而观之,则物与我皆无尽也,而又何羡乎!且夫天地之间,物各有主,苟非吾之所有,虽一毫而莫取。惟江上之清风,与山间之明月,耳得之而为声,目遇之而成色,取之无禁,用之不竭,是造物者之无尽藏也,而吾与子之所共适。”")buffer.sb.WriteString("客喜而笑,洗盏更酌。肴核既尽,杯盘狼籍。相与枕藉乎舟中,不知东方之既白。")defer buffer.wg.Add(-1)}()}after := time.Since(now)fmt.Printf("running time %s\n", after)
}// 运行时间0.836s(运行十次取平均数)func main() {type Buffer struct {sb bytes.Bufferrw sync.RWMutexwg sync.WaitGroup}var buffer Buffernow := time.Now()for i := 0; i < 1000000; i++ {buffer.sb.WriteString("壬戌之秋,七月既望,苏子与客泛舟游于赤壁之下。清风徐来,水波不兴。举酒属客,诵明月之诗,歌窈窕之章。少焉,月出于东山之上,徘徊于斗牛之间。白露横江,水光接天。纵一苇之所如,凌万顷之茫然。浩浩乎如冯虚御风,而不知其所止;飘飘乎如遗世独立,羽化而登仙。")buffer.sb.WriteString("于是饮酒乐甚,扣舷而歌之。歌曰:“桂棹兮兰桨,击空明兮溯流光。渺渺兮予怀,望美人兮天一方。”客有吹洞箫者,倚歌而和之。其声呜呜然,如怨如慕,如泣如诉,余音袅袅,不绝如缕。舞幽壑之潜蛟,泣孤舟之嫠妇。")buffer.sb.WriteString("苏子愀然,正襟危坐而问客曰:“何为其然也?”客曰:“月明星稀,乌鹊南飞,此非曹孟德之诗乎?西望夏口,东望武昌,山川相缪,郁乎苍苍,此非孟德之困于周郎者乎?方其破荆州,下江陵,顺流而东也,舳舻千里,旌旗蔽空,酾酒临江,横槊赋诗,固一世之雄也,而今安在哉?况吾与子渔樵于江渚之上,侣鱼虾而友麋鹿,驾一叶之扁舟,举匏樽以相属。寄蜉蝣于天地,渺沧海之一粟。哀吾生之须臾,羡长江之无穷。挟飞仙以遨游,抱明月而长终。知不可乎骤得,托遗响于悲风。”")buffer.sb.WriteString("苏子曰:“客亦知夫水与月乎?逝者如斯,而未尝往也;盈虚者如彼,而卒莫消长也。盖将自其变者而观之,则天地曾不能以一瞬;自其不变者而观之,则物与我皆无尽也,而又何羡乎!且夫天地之间,物各有主,苟非吾之所有,虽一毫而莫取。惟江上之清风,与山间之明月,耳得之而为声,目遇之而成色,取之无禁,用之不竭,是造物者之无尽藏也,而吾与子之所共适。”")buffer.sb.WriteString("客喜而笑,洗盏更酌。肴核既尽,杯盘狼籍。相与枕藉乎舟中,不知东方之既白。")}after := time.Since(now)fmt.Printf("running time %s\n", after)
}
// 运行时间2.06s(运行十次取平均数)

2. 结论

  1. 单次遍历要写入的数据量很大时,多线程的运行效率会远远超出单线程的运行效率,如果遍历次数很多,推荐使用多线程,如果次数较少,就看需求决定了
  2. 要写入的数据量很小时,多线程的运行效率会远远低于单线程的运行效率,不论是单次遍历还是多次遍历,都推荐使用单线程,这是因为线程的创建销毁锁的控制也是需要时间的,此时逐次写入少量数据的时间要小于线程创建和销毁的时间

3. 知识点

  1. WaitGroup类型
    WaitGroup用于等待一组线程的结束。父线程调用Add方法来设定应等待的线程的数量。每个被等待的线程在结束时应调用Done方法。同时,主线程里可以调用Wait方法阻塞至所有线程结束。
  2. Add方法
    Add方法向内部计数加上delta,delta可以是负数;如果内部计数器变为0,Wait方法阻塞等待的所有线程都会释放,如果计数器小于0,方法panic。注意Add加上正数的调用应在Wait之前,否则Wait可能只会等待很少的线程。一般来说本方法应在创建新的线程或者其他应等待的事件之前调用。
  3. Wait方法
    Wait方法阻塞直到WaitGroup计数器减为0。
  4. 锁的实现
sync.Mutex(互斥锁) sync.RWMutex(读写锁)
当一个goroutine访问的时候,其他goroutine都不能访问,保证了资源的同步,避免了竞争,不过也降低了性能 非写状态时:多个Goroutine可以同时读,一个Goroutine写的时候,其它Goroutine不能读也不能写,性能好
  1. bytes.buffer()不是线程安全的,如果要单次遍历的时候写入顺序是有序的,需要加锁

测试使用bytes.buffer()的单线程与多线程的写效率相关推荐

  1. Operating System-Thread(5)弹出式线程使单线程代码多线程化会产生那些有关问题

    Operating System-Thread(5)弹出式线程&&使单线程代码多线程化会产生那些问题 本文主要内容 弹出式线程(Pop-up threads) 使单线程代码多线程化会产 ...

  2. Redis 属于单线程还是多线程?不同的版本有什么区别?

    Redis 是普及率最高的技术之一,同时也是面试中必问的一个技术模块,所以从今天开始我们将从最热门的 Redis 面试题入手,更加深入的学习和了解一下 Redis. 我们本文的面试题是 Redis 属 ...

  3. 测试AtomicInteger与普通int值在多线程下的递增操作

    日期: 2014年6月10日 作者: 铁锚 Java针对多线程下的数值安全计数器设计了一些类,这些类叫做原子类,其中一部分如下: java.util.concurrent.atomic.AtomicB ...

  4. php采集单线程卡死,php - 为什么我这段curl采集,单线程比多线程还快?

    我这里写了个简单的curl采集,但是执行后发现单线程执行的方式比多线程执行要快很多. 是我的写法又问题吗? $images = [ "http://pic.91taojin.com.cn/d ...

  5. zookeeper的c API 单线程与多线程问题 cli_st和cli_mt

    同样的程序,在centos和ubuntu上都没有问题,在solaris上问题却多多,据说是solaris管理更加严格. zookeeper_init方法,在传入一个错误的host也能初始化出一个非空的 ...

  6. 【Redis】到底是单线程还是多线程以及Redis为什么这么快?

    文章目录 Redis到底是单线程还是多线程的? Redis为什么是单线程的? Redis为什么基于内存? 为什么要为Redis绑定某一固定CPU? Redis的多线程情况 Redis的单线程到底有多快 ...

  7. 单线程、多线程和协程的爬虫性能对比

    作者:小小明 非常擅长解决各类复杂数据处理的逻辑,各类结构化与非结构化数据互转,字符串解析匹配等等. 至今已经帮助很多数据从业者解决工作中的实际问题,如果你在数据处理上遇到什么困难,欢迎与我交流. 豆 ...

  8. Python 爬虫:单线程、多线程和协程的爬虫性能对比

    前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,如有问题请及时联系我们以作处理. PS:如有需要Python学习资料的小伙伴可以点击下方链接自行获取 Python免费学习资料 ...

  9. Python爬虫:单线程、多线程和协程的爬虫性能对比!

    大家好,我是漆柒七7! 首先见面礼 Python学习大礼包 点击领取 然后今天我要给大家分享的是如何爬取豆瓣上深圳近期即将上映的电影影讯,并分别用普通的单线程.多线程和协程来爬取,从而对比单线程.多线 ...

  10. Python爬虫:单线程、多线程和协程的爬虫性能对比

    今天我要给大家分享的是如何爬取豆瓣上深圳近期即将上映的电影影讯,并分别用普通的单线程.多线程和协程来爬取,从而对比单线程.多线程和协程在网络爬虫中的性能. 具体要爬的网址是:https://movie ...

最新文章

  1. 2021年中国工业互联网安全大赛核能行业赛道writeup之机房密码
  2. 10道海量数据处理的面试题
  3. 打包caddy为docker镜像
  4. python中with的用法
  5. 大规模数据处理开源软件
  6. Storm通信机制,Worker进程间通信,Worker进程间通信分析,Worker进程间技术(Netty、ZeroMQ),Worker 内部通信技术(Disruptor)(来自学习资料)
  7. JAVA设计模式 - 建造者模式
  8. 这样做,免费从Oracle同步数据
  9. Android中那些有你不知道的事
  10. linux如何杀死进程最快,如何在Linux系统中杀掉内存消耗最大的进程?
  11. idea原生ajax数据处理(增删改查)
  12. 【FLY】C语言知识点总结
  13. win7 flash 提示加载失败
  14. Ubuntu硬盘分区和挂载
  15. 利用VBA向Word中批量添加图片以及整理成Excel数据的图片名
  16. MySQL命令行中文显示乱码怎么办
  17. Keil的AC6与AC5中文手册
  18. 有什么值得入手的蓝牙耳机品牌?2022年蓝牙耳机品牌排行榜
  19. Java开发技术总结!小米java校招面试题
  20. JS判断页面是否被iframe嵌套

热门文章

  1. python时间和周期_python实现以立春为起点n为周期任意日期所在的日期区间
  2. 奥克兰计算机科学专业世界排名,2019QS世界大学学科排名出炉,新西兰最强专业看过来!...
  3. uc android 面试题,一道新浪UC部门软件测试面试题
  4. HDLBits—Exams/ece241 2014 q7a
  5. word中使用通配符替换【持续更新系列】
  6. 新加坡国际学校IB课程体系
  7. java简单的猜数字游戏
  8. Android 广告视频循环播放 缓存 处理方案
  9. 虚幻四C++入坑指南09:C++实现FPS游戏(3)Pitch Yaw Roll的作用 视角旋转 跳跃
  10. 使用Graphics2D给报警图片画框和提示信息