• 性能测量

  在很多情况之下,通过分析代码是很难确定某个模块性能好坏的。请看下面的例子,你觉得哪一个函数性能最优?

 //斐波那契数
package fib import "math" //递归方式
func Fib(n int) int {
if n < {
return n
}
return Fib(n-) + Fib(n-)
} //迭代方式
func Fib2(n int) int {
if n < {
return n
}
a :=
b :=
c :=
for i := ; i < n; i++ {
c = a + b
a = b
b = c
}
return c;
} //公式求解
func Fib3(n int) int {
gh5 := math.Sqrt()
pow := math.Pow
f := (float64)(n)
return (int)(math.Ceil((pow(+gh5, f) - pow(-gh5,f)) / (pow(2.0, f) * gh5)))
}
上面的代码提供了3种求斐波那契数的方法,毫无疑问第一种方式是最不可取的。但是第二种和第三种方式到底哪一个性能更好呢?好多人可能会说是第三种。口说无凭,写个测试用例看看:
 package fib_test

 import (
"testing"
"goperformance/fib"
) func Test_Fib(t *testing.T) {
println(fib.Fib())
} func Test_Fib2(t *testing.T) {
println(fib.Fib2())
} func Test_Fib3(t *testing.T) {
println(fib.Fib3())
} func Benchmark_Fib(b *testing.B) {
for i := ; i < b.N; i++ {
fib.Fib(i%)
}
} func Benchmark_Fib2(b *testing.B) {
for i := ; i < b.N; i++ {
fib.Fib2(i%)
}
} func Benchmark_Fib3(b *testing.B) {
for i := ; i < b.N; i++ {
fib.Fib3(i%)
}
}

执行 #go test -bench=. -v

 === RUN   Test_Fib

 --- PASS: Test_Fib (.63s)
=== RUN Test_Fib2 --- PASS: Test_Fib2 (.00s)
=== RUN Test_Fib3 --- PASS: Test_Fib3 (.00s)
PASS
Benchmark_Fib- ns/op
Benchmark_Fib2- 13.4 ns/op
Benchmark_Fib3- ns/op
ok goperformance/fib .086s

很明显第二种方式比第三种方式要快100多倍。性能测量为我们编写高性能的go程序提供了可靠的依据。

  • 性能分析

1,使用标准库runtime/pprof

 package main

 import (
"goperformance/fib"
"flag"
"log"
"os"
"runtime/pprof"
) var cpuprofile = flag.String("cpuprofile", "cpu.prof", "write cpu profile to file") func main() {
flag.Parse()
f, err := os.Create(*cpuprofile)
if err != nil {
log.Fatal(err)
}
pprof.StartCPUProfile(f)
defer pprof.StopCPUProfile()
println(fib.Fib())
println(fib.Fib2())
println(fib.Fib3())
}

编译并执行程序获得性能分析文件

 \src\goperformance>go build
\src\goperformance>goperformance.exe \src\goperformance>go tool pprof goperformance.exe cpu.prof
Entering interactive mode (type "help" for commands)
(pprof) web
(pprof)

在web中展示出来的分析结果如下:

2,使用github.com/pkg/profile

profile包实际上是对runtime/pprof的封装,使用起来更加友好

 package main

 import (
"goperformance/fib"
"github.com/pkg/profile"
) func main() {
defer profile.Start().Stop() //可以通过不同的参数确定是cpu性能分析还是内存使用分析
println(fib.Fib())
println(fib.Fib2())
println(fib.Fib3())
}

运行程序后在缓存自动生成一个临时文件,这个文件就是上一种方式中的cpu.prof文件。接下来的操作就和第一种方式一样。

 

go程序性能测量和分析的更多相关文章

  1. python程序之profile分析

    操作系统 : CentOS7.3.1611_x64 python版本:2.7.5 问题描述 1.Python开发的程序在使用过程中很慢,想确定下是哪段代码比较慢: 2.Python开发的程序在使用过程 ...

  2. Linux下简单C语言小程序的反汇编分析

    韩洋原创作品转载请注明出处<Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 写在开始,本文为因为参加MOO ...

  3. 【NOI2015】【程序自己主动分析】【并查集+离散化】

    Description 在实现程序自己主动分析的过程中,经常须要判定一些约束条件能否被同一时候满足. 考虑一个约束满足问题的简化版本号:如果x1,x2,x3,-代表程序中出现的变量.给定n个形如xi= ...

  4. Java程序运行原理分析

    class文件内容 class文件包含Java程序执行的字节码 数据严格按照格式紧凑排列在class文件的二进制流,中间无分割符 文件开头有一个0xcafebabe(16进制)特殊的标志 JVM运行时 ...

  5. 微信小程序应用安全分析及设计

    针对微信关于小程序安全设计的分析 针对微信小程序开发配置及部分配置机制分析微信小程序安全设计: AppSecret 管理员生成AppSecret,在与微信后台交互过程中部分接口使用,如 auth.co ...

  6. 软件性能测试分析与调优实践之路-Java应用程序的性能分析与调优-手稿节选

    Java编程语言自从诞生起,就成为了一门非常流行的编程语言,覆盖了互联网.安卓应用.后端应用.大数据等很多技术领域,因此Java应用程序的性能分析和调优也是一门非常重要的课题.Java应用程序的性能直 ...

  7. C/C++程序CPU问题分析

    转载地址:http://www.10tiao.com/html/473/201606/2651473094/1.html   程序的CPU问题是另外一类典型的程序性能问题,很多开发人员都受到过程序CP ...

  8. 基于Linux C的socket抓包程序和Package分析 (一)

    版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/guankle/article/details/27538031  測试执行平台:CentOS 6 ...

  9. IDEA 程序直接运行分析

    今天用IDEA运行SpringBoot程序,启动时始终报错说读取不到datasource的url配置. 分析代码的resources目录,是有配置文件的,配置也是正常的.如下图: 后来经人指点,是因为 ...

随机推荐

  1. Windows 8.1 Update中的小改变

    在Build 2014大会中,发布了Windows 8.1 Update的更新,并将于4月8日通过Windows Update进行推送.但是,在MSDN订阅下载中,带有该更新的镜像已经可以在4月3号放 ...

  2. hdu 4704 Sum 【费马小定理】

    题目 题意:将N拆分成1-n个数,问有多少种组成方法. 例如:N=4,将N拆分成1个数,结果就是4:将N拆分成2个数,结果就是3(即:1+3,2+2,3+1)--1+3和3+1这个算两个,则这个就是组 ...

  3. 使用PerfView监测.NET程序性能(一):Event Trace for Windows

    前言: 在日常项目开发中,我们时不时会遇到程序占用了很高CPU的情况,可能是程序里某些未经优化的代码或者Bug,或者是程序运行压力太大.无论是什么原因,我们总希望能看到到底是哪个方法占用了如此高的CP ...

  4. 使用更改跟踪(ChangeTracking)来实现数据类型变更

    在现实场景中,我们经常会遇到修改数据类型的场景,尤其是自增列从INT修改为BIGINT的情况,自增列又通常作为表的主键和聚集索引键,因此修改操作需要按以下步骤来进行 1. 停止对该表的访问(通过禁用权 ...

  5. FFmpeg4.0笔记:rtsp2rtmp

    Github https://github.com/gongluck/FFmpeg4.0-study.git #include <iostream> using namespace std ...

  6. 使用EF6连接mariaDB出现中文查找不到数据的问题

    1.问题描述 这两天使用ef6.0查询mariaDB出现了数据查询不到的情况 2.问题分析 后来发现除了这段数据查询不到,其他都能查询,于是逐步对比代码,发现其他数据都是英文的,而这句是中文的于是把条 ...

  7. ABP框架入门踩坑-配置数据库表前缀

    配置数据库表前缀 ABP踩坑记录-目录 本篇其实和ABP关系并不大,主要是EF Core的一些应用-.-. 起因 支持数据库表前缀应该是很多应用中比较常见的功能,而在ABP中并没直接提供这一功能,所以 ...

  8. Spring Boot中使用JdbcTemplate访问数据库

    本文介绍在Spring Boot基础下配置数据源和通过JdbcTemplate编写数据访问的示例. 数据源配置 在我们访问数据库的时候,需要先配置一个数据源,下面分别介绍一下几种不同的数据库配置方式. ...

  9. Java按时间梯度实现异步回调接口

    1. 背景 在业务处理完之后,需要调用其他系统的接口,将相应的处理结果通知给对方,若是同步请求,假如调用的系统出现异常或是宕机等事件,会导致自身业务受到影响,事务会一直阻塞,数据库连接不够用等异常现象 ...

  10. OS之内存管理 --- 虚拟内存管理(一)

    虚拟内存的背景 在基本的内存管理策略中,所有的策略的相同点都是:每个进程在执行之前需要完全处于内存中.那有没有一种方法可以不需要将进程所有页面加载到内存中就可以开始运行进程呢?有没有可能在进程需要某些 ...