通向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, 来描述代码中的常量
• 在需要分配大量内存的情况下, 应当使用缓冲
• 应使用模板缓存