对 Go 程序进行可靠的性能测试对 Go 程序进行可靠的性能测试 Changkun Ou https://changkun.de/s/gobench/ Go 夜读系列 |talkgo.org|Talk Go|第 83 期 March 26, 2020 # Go 1.13 / 1.14 2020 © Changkun Ou · Go 夜读 · 对 Go 程序进行可靠的性能测试 主要内容 ● 可靠的测试环境 ● benchstat 例2: Benchmark 的正确性分析 ○ 例3: 其他的影响因素 ● 假设检验的原理 ● 局限与应对措施 ● 总结 2020 © Changkun Ou · Go 夜读 · 对 Go 程序进行可靠的性能测试 教科书式的性能测试方法论 3 在《Software Testing: Principles and Practices》一书中归纳的性能测试方法论: 1. 搜集需求 2 性能调优 7. 性能基准测试(Performance Benchmarking) 8. 向客户推荐合适的配置 可靠的测试环境 2020 © Changkun Ou · Go 夜读 · 对 Go 程序进行可靠的性能测试 什么是可靠的性能基准测试环境 5 影响测试环境的软硬件因素 ● 硬件:CPU 型号、温度、IO 等 ● 软件:操作系统版本、当前系统调度的负载等 指导思想 ● 单次0 码力 | 37 页 | 1.23 MB | 1 年前3
如何消除程序中的数据竞争-周光远如何消除程序中的数据竞争 周光远 华为 从一些问题说起 1 2 3 什么是数据竞争 Go语言中的数据竞争(data race): data race occurs when two goroutines access the same variable concurrently and at least one of the accesses is a write. 数据竞争(data 数据竞争(data race):在程序中,多线程 (至少两个线程)并发访问同一个内存地址, 且至少其中一次访问是写操作。 data Thread1 Thread2 data goroutine1 goroutine2 从微观看数据竞争 时间上:多个并发的读写操作被观察到的顺序无法预知。 空间上:并发读写时观察到非预期的数据。 a:1 b:2 a:2 b:1 a:1 b:2 a:2 b:1 也被写入。 2. 在main中,不保证一定能观察到done被写入。 来源:https://golang.org/ref/mem 消除数据竞争的误区:基础数据类型的数据竞争 硬件对存在数据竞争的程序的行为不做任何保证。 对于int,float,bool,指针系列的数据类型,这些数据类型上出现的数据竞争意味着什么? 示意代码,复现需要增加额外处理。 这些数据类型的大小小于等于寄存器的宽度,并且go语言0 码力 | 30 页 | 1.92 MB | 1 年前3
Hello 算法 1.1.0 Go版到解放生产力的工业产品、再到宇宙运行的科学规律,几乎每一件平凡或令人惊叹的事物背后,都隐藏着精 妙的算法思想。 同样,数据结构无处不在:大到社会网络,小到地铁线路,许多系统都可以建模为“图”;大到一个国家,小 到一个家庭,社会的主要组织形式呈现出“树”的特征;冬天的衣服就像“栈”,最先穿上的最后才能脱下; 羽毛球筒则如同“队列”,一端放入、另一端取出;字典就像一个“哈希表”,能够快速查找目标词条。 为渐近复杂度分析(asymptotic complexity analysis),简称复杂度分析。 复杂度分析能够体现算法运行所需的时间和空间资源与输入数据大小之间的关系。它描述了随着输入数据大 小的增加,算法执行所需时间和空间的增长趋势。这个定义有些拗口,我们可以将其分为三个重点来理解。 ‧“时间和空间资源”分别对应时间复杂度(time complexity)和空间复杂度(space complexity)。 在算法中,重复执行某个任务是很常见的,它与复杂度分析息息相关。因此,在介绍时间复杂度和空间复杂 度之前,我们先来了解如何在程序中实现重复执行任务,即两种基本的程序控制结构:迭代、递归。 2.2.1 迭代 迭代(iteration)是一种重复执行某个任务的控制结构。在迭代中,程序会在满足一定的条件下重复执行某段 代码,直到这个条件不再满足。 1. for 循环 for 循环是最常见的迭代形式之一,适合在预先知道迭代次数时使用。0 码力 | 383 页 | 18.48 MB | 1 年前3
Hello 算法 1.0.0 Golang版为「渐近复杂度分析 asymptotic complexity analysis」,简称「复杂度分析」。 复杂度分析能够体现算法运行所需的时间和空间资源与输入数据大小之间的关系。它描述了随着输入数据大 小的增加,算法执行所需时间和空间的增长趋势。这个定义有些拗口,我们可以将其分为三个重点来理解。 ‧“时间和空间资源”分别对应「时间复杂度 time complexity」和「空间复杂度 space complexity」。 在算法中,重复执行某个任务是很常见的,它与复杂度分析息息相关。因此,在介绍时间复杂度和空间复杂 度之前,我们先来了解如何在程序中实现重复执行任务,即两种基本的程序控制结构:迭代、递归。 2.2.1 迭代 「迭代 iteration」是一种重复执行某个任务的控制结构。在迭代中,程序会在满足一定的条件下重复执行某 段代码,直到这个条件不再满足。 1. for 循环 for 循环是最常见的迭代形式之一,适合在预先知道迭代次数时使用。 成正比,或者说成“线性关系”。实际上,时间复杂度描述的就是 这个“线性关系”。相关内容将会在下一节中详细介绍。 2. while 循环 与 for 循环类似,while 循环也是一种实现迭代的方法。在 while 循环中,程序每轮都会先检查条件,如果条 件为真,则继续执行,否则就结束循环。 下面我们用 while 循环来实现求和 1 + 2 + ⋯ + ? : // === File: iteration.go ===0 码力 | 382 页 | 17.60 MB | 1 年前3
Hello 算法 1.2.0 简体中文 Go 版到解放生产力的工业产品、再到宇宙运行的科学规律,几乎每一件平凡或令人惊叹的事物背后,都隐藏着精 妙的算法思想。 同样,数据结构无处不在:大到社会网络,小到地铁线路,许多系统都可以建模为“图”;大到一个国家,小 到一个家庭,社会的主要组织形式呈现出“树”的特征;冬天的衣服就像“栈”,最先穿上的最后才能脱下; 羽毛球筒则如同“队列”,一端放入、另一端取出;字典就像一个“哈希表”,能够快速查找目标词条。 基石,而算法为数据结构注入生命力。 ‧ 我们可以将数据结构与算法类比为拼装积木,积木代表数据,积木的形状和连接方式等代表数据结构, 拼装积木的步骤则对应算法。 1. Q & A Q:作为一名程序员,我在日常工作中从未用算法解决过问题,常用算法都被编程语言封装好了,直接用就 可以了;这是否意味着我们工作中的问题还没有到达需要算法的程度? 如果把具体的工作技能比作是武功的“招式”的话,那么基础科目应该更像是“内功”。 为渐近复杂度分析(asymptotic complexity analysis),简称复杂度分析。 复杂度分析能够体现算法运行所需的时间和空间资源与输入数据大小之间的关系。它描述了随着输入数据大 小的增加,算法执行所需时间和空间的增长趋势。这个定义有些拗口,我们可以将其分为三个重点来理解。 ‧“时间和空间资源”分别对应时间复杂度(time complexity)和空间复杂度(space complexity)。0 码力 | 384 页 | 18.49 MB | 10 月前3
Hello 算法 1.0.0b1 Golang版独立于编程语言,即可用多种语言实现。 1.2.2. 数据结构定义 「数据结构 Data Structure」是在计算机中组织与存储数据的方式。为了提高数据存储和操作性能,数据结构 的设计原则有: ‧ 空间占用尽可能小,节省计算机内存。 ‧ 数据操作尽量快,包括数据访问、添加、删除、更新等。 1. 引言 hello‑algo.com 10 ‧ 提供简洁的数据表示和逻辑信息,以便算法高效运行。 数据结构的设计 定的误导性。反之,「最差时间复杂度」最为实用,因为它给出了一个“效率安全值”,让我们 可以放心地使用算法。 从上述示例可以看出,最差或最佳时间复杂度只出现在“特殊分布的数据”中,这些情况的出现概率往往很 小,因此并不能最真实地反映算法运行效率。相对地,「平均时间复杂度」可以体现算法在随机输入数据下的 运行效率,用 Θ 记号(Theta Notation)来表示。 对于部分算法,我们可以简单地推算出随 ‧「暂存数据」用于保存算法运行中的各种 常量、变量、对象 等。 ‧「栈帧空间」用于保存调用函数的上下文数据。系统每次调用函数都会在栈的顶部创建一个栈帧,函数返 回时,栈帧空间会被释放。 ‧「指令空间」用于保存编译后的程序指令,在实际统计中一般忽略不计。 2. 复杂度分析 hello‑algo.com 28 Figure 2‑9. 算法使用的相关空间 /* 结构体 */ type node struct {0 码力 | 190 页 | 14.71 MB | 1 年前3
Hello 算法 1.0.0b2 Golang版独立于编程语言,即可用多种语言实现。 1.2.2. 数据结构定义 「数据结构 Data Structure」是在计算机中组织与存储数据的方式。为了提高数据存储和操作性能,数据结构 的设计原则有: ‧ 空间占用尽可能小,节省计算机内存。 ‧ 数据操作尽量快,包括数据访问、添加、删除、更新等。 1. 引言 hello‑algo.com 10 ‧ 提供简洁的数据表示和逻辑信息,以便算法高效运行。 数据结构的设计 定的误导性。反之,「最差时间复杂度」最为实用,因为它给出了一个“效率安全值”,让我们 可以放心地使用算法。 从上述示例可以看出,最差或最佳时间复杂度只出现在“特殊分布的数据”中,这些情况的出现概率往往很 小,因此并不能最真实地反映算法运行效率。相对地,「平均时间复杂度」可以体现算法在随机输入数据下的 运行效率,用 Θ 记号(Theta Notation)来表示。 对于部分算法,我们可以简单地推算出随 ‧「暂存数据」用于保存算法运行中的各种 常量、变量、对象 等。 ‧「栈帧空间」用于保存调用函数的上下文数据。系统每次调用函数都会在栈的顶部创建一个栈帧,函数返 回时,栈帧空间会被释放。 ‧「指令空间」用于保存编译后的程序指令,在实际统计中一般忽略不计。 2. 复杂度分析 hello‑algo.com 28 Figure 2‑9. 算法使用的相关空间 /* 结构体 */ type node struct {0 码力 | 202 页 | 15.73 MB | 1 年前3
Hello 算法 1.0.0b5 Golang版迭代与递归 在数据结构与算法中,重复执行某个任务是很常见的,其与算法的复杂度密切相关。而要重复执行某个任务, 我们通常会选用两种基本的程序结构:迭代和递归。 2.2.1 迭代 「迭代 iteration」是一种重复执行某个任务的控制结构。在迭代中,程序会在满足一定的条件下重复执行某 段代码,直到这个条件不再满足。 1. for 循环 for 循环是最常见的迭代形式之一,适合预先知道迭代次数时使用。 成正比,或者说成“线性关系”。实际上,时间复杂度描述的就是 这个“线性关系”。相关内容将会在下一节中详细介绍。 2. while 循环 与 for 循环类似,while 循环也是一种实现迭代的方法。在 while 循环中,程序每轮都会先检查条件,如果条 件为真则继续执行,否则就结束循环。 下面,我们用 while 循环来实现求和 1 + 2 + ⋯ + ? 。 // === File: iteration.go === 关系”、以此类推。 2.2.2 递归 「递归 recursion」是一种算法策略,通过函数调用自身来解决问题。它主要包含两个阶段。 1. 递:程序不断深入地调用自身,通常传入更小或更简化的参数,直到达到“终止条件”。 2. 归:触发“终止条件”后,程序从最深层的递归函数开始逐层返回,汇聚每一层的结果。 而从实现的角度看,递归代码主要包含三个要素。 1. 终止条件:用于决定什么时候由“递”转“归”。0 码力 | 379 页 | 30.70 MB | 1 年前3
Hello 算法 1.0.0b4 Golang版带来一定的误导性。相反,「最差时间复杂度」更为实用,因为它给出了一个“效率安全值”, 让我们可以放心地使用算法。 从上述示例可以看出,最差或最佳时间复杂度只出现在“特殊分布的数据”中,这些情况的出现概率可能很 小,因此并不能最真实地反映算法运行效率。相较之下,「平均时间复杂度」可以体现算法在随机输入数据下 的运行效率,用 Θ 记号来表示。 对于部分算法,我们可以简单地推算出随机数据分布下的平均情况。比如上述示例,由于输入数组是被打乱 对象等。 ‧「栈帧空间」用于保存调用函数的上下文数据。系统在每次调用函数时都会在栈顶部创建一个栈帧,函 数返回后,栈帧空间会被释放。 ‧「指令空间」用于保存编译后的程序指令,在实际统计中通常忽略不计。 因此,在分析一段程序的空间复杂度时,我们一般统计 暂存数据、输出数据、栈帧空间 三部分。 Figure 2‑9. 算法使用的相关空间 2. 复杂度 hello‑algo.com 29 /* (1) ;但当 ? > 10 时,初始化的数组 nums 占 用 ?(?) 空间;因此最差空间复杂度为 ?(?) 。 ‧ 以算法运行过程中的峰值内存为准。例如,程序在执行最后一行之前,占用 ?(1) 空间;当初始化数组 nums 时,程序占用 ?(?) 空间;因此最差空间复杂度为 ?(?) 。 func algorithm(n int) { a := 0 // O(1) b := make([]int0 码力 | 347 页 | 27.40 MB | 1 年前3
使用Go与redis构建有趣的应用使⽤用 Go 和 Redis 构建有趣的程序 ⻩黄健宏 @ huangz.me 关于我 • ⻩黄健宏,⽹网名 huangz ,⼴广东清远⼈人。 • 计算机技术图书作者和译者,偶尔也写⼀一点⼩小程序⾃自娱⾃自乐。 • 精通 Go、 Python 、 Ruby 、 PHP、 C 等数⼗十种语⾔言……的 Hello World ! • 著作:《Redis 设计与实现》,《Redis 使⽤用教程》(写作中)。 构建在线⽤用户统计器器 路路线图 ⼀一. Redis 简介 ⼆二. 使⽤用 Redis 构建锁 三. 使⽤用 Redis 构建在线⽤用户统计器器 四. 使⽤用 Redis 构建⾃自动补完程序 Redis an open source, in-memory data structure store 特点 特点 • 具有多种不不同的数据结构可⽤用,其中包括:字符串串、散列列、列列表、集合、有序集合、位图 “mary” “david” 分值 成员 1.5 ”banana” 2.5 “cherry” 3.7 “apple” 8.3 “durian” 有序集合 各不不相同的多个成员按分值⼤大⼩小进⾏行行排列列、可以按分值顺序或者成员顺序执⾏行行多项有序操作、使⽤用 Skip List 实现 索引 0 1 2 3 4 5 6 7 位 0 1 1 0 1 1 1 0 位图(bitmap)0 码力 | 176 页 | 2.34 MB | 1 年前3
共 57 条
- 1
- 2
- 3
- 4
- 5
- 6













