通向Golang的捷径【18. 性能优化的代码示例】

18.1 字符串

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

18.2 数组和 slice

创建变量:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

18.3 map

在这里插入图片描述
在这里插入图片描述

18.4 结构

创建变量:
在这里插入图片描述
在这里插入图片描述
使用结构变量名的第一个字母的大写, 可使结构变量能在包外被访问 (可见), 通常情况下, 最好使用一个工厂函数, 来定义结构变量, 有时需强制使用, 参见 10.2 节.
在这里插入图片描述

18.5 接口

在这里插入图片描述

18.6 函数

在这里插入图片描述

18.7 文件

在这里插入图片描述
在这里插入图片描述

18.8 并发协程和并发通道

18.8.1 使用建议

并发执行的效率远高于串行计算, 同时在并发协程中, 任务的执行成本, 也高于并发线程的创建和通讯的成本.

• 使用带缓冲的并发通道, 可提升性能
一个带缓冲的并发通道更容易实现双向传输, 这依赖于上下文环境所给出的性能 (通常可提升 10 倍以上), 如果并发通道的缓存容量进行调整, 还可进一步提升性能.

• 限制放入并发通道的数据量, 而将其放入到数组中
如果在并发协程之间需要传输大量数据, 并发通道将变成一个瓶颈, 这时可在数组中, 实现巨量数据的压
缩, 等完成传输后, 再进行解压, 通常情况下, 可将传输速率提升 10 倍以上.
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
• 并发通道的迭代器模式, 参见 14.11 节
• 限制并发请求的数量, 参见 14.11 节
• 在多核处理器中, 实现并行计算, 参见 14.13 节
• 终止一个并发协程
在这里插入图片描述
在这里插入图片描述
• 让长时间运行的程序放弃同步操作, 参见 14.5 节
• 使用包含并发通道的计时器和定时器, 参见 14.5 节
• 典型的后台服务器模式, 参见 14.4 节

18.9 网络与 web 应用

18.9.1 模板

• 创建, 再解析和验证一个模板
在这里插入图片描述
• 如果在 web 环境中, 可使用 html 过滤器, 转义 html 特殊字符, 比如 {{html .}}, 或是转义一个结构数据
域, 如 {{.FieldName |html}}
• 使用模板缓存, 参见 15.7 节

18.10 常见用法

• 当出现错误时, 可终止程序
在这里插入图片描述

18.11 获得最佳性能的编程指南

• 在允许的情况下 (函数中), 应使用包含初始化的声明格式, 即:=.
• 应使用字节数据, 来替代字符串
• 应使用 slice 来替代数组
• 在允许的情况下, 应使用 slice 或数组, 来替代 map
• 如果只需处理数值, 不想理会索引值时, 可在 for-range 循环中, 遍历一个 slice, 因为 for-range 的速度稍快
• 如果数组处于稀疏状态 (包含大量的零值和 nil), 可替换成一个 map, 以减少内存的用量
• 为 map 类型, 指定一个初始容量
• 在定义方法时, 应使用一个结构指针作为接收器
• 应使用 constant 或 flag, 来描述代码中的常量
• 在需要分配大量内存的情况下, 应当使用缓冲
• 应使用模板缓存

在这里插入图片描述