Golang

数据说话:Go语言的Switch和Map性能实测

<p>在开发<a href="https://github.com/jackc/pgx" target="_blank" rel="noopener">pgx</a>(一个针对Go语言的PostgreSQL driver)的时候,有好几次我都需要在20多个代码分支间跳转。通常我会选用switch语句。还有个更加可读的实现方法是使用函数map。我一开始认为用switch语句进行分支跳转比一个map查找和函数调用更快。数据库驱动(database driver)的性能是一个很重要的考量,所以在做

性能优化实战:百万级WebSockets和Go语言

<p>大家好!我的名字叫Sergey Kamardin。我是来自<strong>Mail.Ru</strong>的一名工程师。这篇文章将讲述我们是如何用Go语言开发一个高负荷的WebSocket服务。即使你对WebSockets熟悉但对Go语言知之甚少,我还是希望这篇文章里讲到的性能优化的思路和技术对你有所启发。</p> <h2 id="1-介绍">1. 介绍</h2> <p>作为全文的铺垫,我想先讲一下我们为什么要开发这个服务。</p> <p><strong>Mail.Ru</str

用Golang处理每分钟百万级请求

<p>我在防垃圾邮件,防病毒和防恶意软件领域已经工作了15年,前后在好几个公司任职。我知道这些系统最后都会因为要处理海量的数据而变得非常复杂。</p> <p>我现在是<a href="https://smsjunk.com/" target="_blank" rel="noopener">smsjunk.com</a>的CEO并且是<a href="http://knowbe4.com/" target="_blank" rel="noopener">KnowBe4</a>的首席架构师。这

调试Go语言的核心转储(Core Dumps)

<p>检查程序的执行路径和当前状态是非常有用的调试手段。核心文件(core file)包含了一个运行进程的内存转储和状态。它主要是用来作为事后调试程序用的。它也可以被用来查看一个运行中的程序的状态。这两个使用场景使调试文件转储成为一个非常好的诊断手段。我们可以用这个方法来做事后诊断和分析线上的服务(production services)。</p> <p>在这篇文章中,我们将用一个简单的hello world网站服务作为例子。在现实中,我们的程序很容易就会变得很复杂。分析核心转储给我们提供了一

Debugging Go Core Dumps

<p>Debugging is highly useful to examine the execution flow and to understand the current state of a program.</p> <p>Core files is a file that contains the memory dump of a running process and its process status. It is primarily used for post-mortem

Go语言的栈空间管理

<p>在CloudFlare,我们使用Go语言搭建各种服务和应用。在这篇博文里,我们将对Go语言的技术特点进行深度分析。Go语言里最重要的一个特性就是goroutine。它们的开销比较小,相互协作地调度线程来运行。它们有广泛的用途,比如实现超时控制(timeouts),生成器(generators),以及在多个后台应用之间实现相互竞争(racing)。为了使goroutine能够适应更多的任务,我们必须保证每个goroutine占用很少的内存。同时,人们应该可以很方便地创建goroutine。<

Goroutine是如何工作的?

<h2 id="go语言">Go语言</h2> <p>如果你刚刚接触Go语言,或者说你并不理解“并发不等于并行”这句话的含义,那么Rob Pike的<a href="http://www.youtube.com/watch?v=cN_DpYBzKso" target="_blank" rel="noopener">讲座</a>值得一看(在youtube上)。这个视频有30分钟长,我保证花30分钟看这段视频是非常值得的。</p> <p></p> <p>这里摘录一段他提到的并发和并行之间的区别

剖析使Go语言高效的5个特性(5/5): Goroutine的栈管理

<h2 id="goroutine的栈管理">Goroutine的栈管理</h2> <p>在上一篇文章里,我们已经讨论了goroutine减少了对上百个并发运行的线程的管理开销。这里我们要在讨论下goroutine的另外一个方面,它的栈管理。</p> <p></p> <p>下面是一个进程的内存布局图。这个图里我们关心的是堆和栈的位置。</p> <img style="border:1px solid #cccccc; margin:auto;display:block" src="/st

剖析使Go语言高效的5个特性(4/5): Goroutines

<h2 id="goroutines">Goroutines</h2> <p>Go语言有goroutines。它们是Go语言里并发编程的基石。</p> <p>首先,我们来了解goroutines产生的历史。在一开始,计算机只能跑一个进程。然后到了60年代,多进程或者说是分时的概念变得很流行。在一个分时系统里,操作系统必须不停地将CPU上运行的进程进行切换。这种切换必须要将当前的进程状态保存下来,并且将下一个进程的状态恢复到CPU上。这个过程叫<strong>进程切换(process swit

剖析使Go语言高效的5个特性(3/5): 垃圾回收机制

<h2 id="垃圾回收机制-garbage-collection">垃圾回收机制(Garbage Collection)</h2> <p>Go语言因为强制的内存垃圾回收机制变得更加简单和安全。但这并不意味着垃圾回收机制把Go程序变慢了,或者说垃圾回收机制最终决定了你程序的速度。不可否认,在堆(heap)上分配内存是有代价的。每次垃圾回收机制触发都会消耗一定的CPU。除非内存都被释放了,这些开销是不可避免的。</p> <p></p> <p>但是还有另外一个地方我们可以用来分配内存。那就是栈

剖析使Go语言高效的5个特性(2/5): 函数调用不是免费的

<h2 id="函数调用不是免费的">函数调用不是免费的</h2> <p>一个函数调用有三个步骤。创建一个新的堆栈框(stack frame)并把调用者的详细信息记录下来。把任何会被被调用函数用到的寄存器内容保存到堆栈。计算被调用函数的地址,并执行跳转指令到那个新的地址。</p> <p></p> <img style="border:1px solid #cccccc; margin:auto;display:block" src="/static/post/01/Gocon-2014-1

剖析使Go语言高效的5个特性(1/5): 变量的处理和存储

<p>我最近受邀在Gocon会议上做了一个演讲。Gocon是一个非常棒的,每半年一次在日本东京举行的Go会议。<a href="http://ymotongpoo.hatenablog.com/entry/2014/06/01/124350" target="_blank" rel="noopener">Gocon 2014</a>是完全由社区举办的一整天活动。它包括了培训以及一个下午的演讲。演讲的主题主要围绕在Go语言在线上环境中的应用。</p> <p>以下是我的演讲稿。原始的演讲稿强调慢而