go程序性能测量和分析
- 性能测量
在很多情况之下,通过分析代码是很难确定某个模块性能好坏的。请看下面的例子,你觉得哪一个函数性能最优?
//斐波那契数
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程序性能测量和分析的更多相关文章
- python程序之profile分析
操作系统 : CentOS7.3.1611_x64 python版本:2.7.5 问题描述 1.Python开发的程序在使用过程中很慢,想确定下是哪段代码比较慢: 2.Python开发的程序在使用过程 ...
- Linux下简单C语言小程序的反汇编分析
韩洋原创作品转载请注明出处<Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 写在开始,本文为因为参加MOO ...
- 【NOI2015】【程序自己主动分析】【并查集+离散化】
Description 在实现程序自己主动分析的过程中,经常须要判定一些约束条件能否被同一时候满足. 考虑一个约束满足问题的简化版本号:如果x1,x2,x3,-代表程序中出现的变量.给定n个形如xi= ...
- Java程序运行原理分析
class文件内容 class文件包含Java程序执行的字节码 数据严格按照格式紧凑排列在class文件的二进制流,中间无分割符 文件开头有一个0xcafebabe(16进制)特殊的标志 JVM运行时 ...
- 微信小程序应用安全分析及设计
针对微信关于小程序安全设计的分析 针对微信小程序开发配置及部分配置机制分析微信小程序安全设计: AppSecret 管理员生成AppSecret,在与微信后台交互过程中部分接口使用,如 auth.co ...
- 软件性能测试分析与调优实践之路-Java应用程序的性能分析与调优-手稿节选
Java编程语言自从诞生起,就成为了一门非常流行的编程语言,覆盖了互联网.安卓应用.后端应用.大数据等很多技术领域,因此Java应用程序的性能分析和调优也是一门非常重要的课题.Java应用程序的性能直 ...
- C/C++程序CPU问题分析
转载地址:http://www.10tiao.com/html/473/201606/2651473094/1.html 程序的CPU问题是另外一类典型的程序性能问题,很多开发人员都受到过程序CP ...
- 基于Linux C的socket抓包程序和Package分析 (一)
版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/guankle/article/details/27538031 測试执行平台:CentOS 6 ...
- IDEA 程序直接运行分析
今天用IDEA运行SpringBoot程序,启动时始终报错说读取不到datasource的url配置. 分析代码的resources目录,是有配置文件的,配置也是正常的.如下图: 后来经人指点,是因为 ...
随机推荐
- oracle的删除方法
手工彻底删除oracle 第一步:停用全部oracle服务 第二步:删除oracle注册表运行regedit在如下路径中找到oracle相关键值,删除 HKEY_LOCAL_MACHINE\SOFTW ...
- Elasticsearch 系列2 --- 安装elasticsearch-head管理工具
elasticsearch-head是elasticsearch的一个管理页面,它的官网是https://github.com/mobz/elasticsearch-head 通过官网我们得知,ES5 ...
- net 把指定 URI 的资源下载到本地
DirectoryInfo dir = new DirectoryInfo(AppContext.BaseDirectory); var path = dir.FullName + @"te ...
- ASP .Net C# ---CSV导入导出
CSV和Excel大致相同 复制下来 数据传到方法里面就可以了 /// <summary> /// DataTable数据写入CSV文件 /// </summary> /// ...
- WPF 右上角带数字的按钮
效果如图所示 三种方案, 1:不改控件模版,布局实现,死开 2:改button模版,利用附加属性,附加附加属性,功能多了话,不利于拓展 3:继承button,添加依赖属性,接下来是这种 1:新建类 为 ...
- Python 生成器, 迭代器, 可迭代对象的区别
1.可迭代对象 在python中, 一切皆对象, 但凡是可以用for循环进行遍历取值的对象都可以称之为可迭代对象, 可迭代对象在程序的一个执行周期中,可以无限轮次的进行循环遍历 2.迭代器 a.一个可 ...
- TmsTimeUtils 时间戳
package com.sprucetec.tms.utils; import java.math.BigDecimal;import java.text.DateFormat;import java ...
- 多个JDK下TOMCAT运行设置
当OS中含有多个JDK版本时,设置TOMCAT下JAVA环境变量信息的办法: 1.在setclasspath.bat或者setclasspath.sh下设置 set JAVA_HOME=d:\java ...
- String s=“dd”和String s=new String("dd")区别
Java中String s="dd"的话会先检查常量池中是否有"dd"这个字符串,如果没有则创建一个,然后将s指向字符串的地址,而new String(&quo ...
- python(29)----时间模块
time模块 1. 三种时间表现形式 时间戳(timestamp) 格式化的时间字符串 元祖/结构化时间(struct_time) 2. 时间戳(timestamp) 通常来说,时间戳表示的是从197 ...