Try   HackMD

Go パフォーマンスチェッカー

文字列

  • 文字列結合で +演算子を使わない(bytes.Bufferstrings.Join()を使う)
  • 正規表現をなるべく使わず、stringsパッケージを使う

IO

  • fmt.Print系を使わず、バッファリングする
// 良い例
b := bufio.NewWriter(os.Stdout)
defer b.Flush()

for i:=0;i<10;i++{
    fmt.Fprintln(b,strings.Repeat("a",100))
}

並行処理

  • 重い処理を直列で処理している部分はないか
  • チャネルを必ずcloseする
  • Mutexのロック処理は必要なところだけ
  • context.WithCancelcontext.WithTimeoutを使うときは必ずdefer cancel()を書く

http関連

  • タイムアウトを設定していい場合は設定する
  • HTTPリクエストを送る時defer resp.Body.Close()
  • 静的ファイルをアプリケーションから配信せず、Nginxなどに移譲

DB

  • N+1はダメよダメダメ
  • 何度もsql.Openを呼び出さない
    • Goのsql.DB構造体は0以上のコネクションプールを持っていて、複数のGoroutineからのアクセスにも対応している
    • そのため、何回もsql.Openを使うとコネクションリークを起こしてしまう
  • sql.SetMaxIdleConnsSetMaxOpenConns()でコネクション数を変更する

reflect

  • そもそも使わない