タグ

Goとチューニングに関するakatakunのブックマーク (7)

  • golang で string を []byte にキャストしてもメモリコピーが走らない方法を考えてみる - Qiita

    package main import ( "unsafe" ) type foo struct { k int64 v int64 } func main() { f := &foo{3,4} // unsafe.Pointer() で匿名ポインタにして // uintptr() で演算可能にして // +8 バイト(64bit)足して // unsafe.Pointer で匿名ポインタに戻して // そこにはフィールド v があるはずなので *int64 にキャストして // デリファレンスすれば出来上がり *(*int64)(unsafe.Pointer((uintptr(unsafe.Pointer(f))+8))) = 5 // グヒヒ println(f.v) // 5 } 0x001c 00028 (stringbytes2.go:8) LEAL go.string."he

    golang で string を []byte にキャストしてもメモリコピーが走らない方法を考えてみる - Qiita
  • GoのパフォーマンスTipsメモ

    パフォーマンス維持のコツをコツコツとメモする リフレクションは最後の手段 パフォーマンスに寄与しない部分でのみ使う。 どこがパフォーマンスに寄与するのかが不透明なうちは使用禁止のほうが良い。 一度使い出すとリフレクションは多用したくなる魔力がある。 メモリ使用量 値は8バイトアライメントに置かれるので基は8バイト長分メモリを専有。 ポインタ変数は64bitCPUで8バイト長 インターフェース型変数は16バイト長〜 (値+型識別) メモリ確保を含む型コンバートは 型キャスト、アサーションに比べると10倍以上遅い。 同じ値なのに「メモリ確保を含む型コンバート」を複数回行う場合は メモリ消費量は増えるが汎用の変数「interface{}」に 値を保存しておいて参照するほうが速度を維持できる。 ゼロメモリアロケーション 高頻度操作におけるメモリアロック1とゼロの間には大きな速度差がある。 可能で

    akatakun
    akatakun 2018/03/14
    リフレクションはパフォーマンスに寄与しない部分でのみ使う,ゼロ値がデフォルトになるような値の持ち方が好ましい
  • golang で string を []byte にキャストするとメモリコピーが走ります - Qiita

    いまはもっと賢くなってる。最適化バンザイ https://medium.com/a-journey-with-go/go-string-conversion-optimization-767b019b75ef 概要 string を byte スライスにしたり,またその逆だったりをおこなうのに, なんてコードをよく書きます.string は読み込み専用のスライスみたいな物だという認識だったので,キャストしても,ポインタがコピーされるだけで,必要になったらコピーされるだろうぐらいに思ってたんですが,調べてみたらメモリがまるっとコピーされるのでパフォーマンスに影響しそうなときは要注意です. 詳細 string を byte スライスにキャストするプログラムを書いて,アセンブリコードを吐かせてみました.

    golang で string を []byte にキャストするとメモリコピーが走ります - Qiita
    akatakun
    akatakun 2018/03/09
    なるべくstring<=>[]byteの変換を減らして アロケーションやメモリコピーを減らす ,とりあえず[]byte使う
  • Goの文字列結合のパフォーマンス - Qiita

    Goで文字列結合をする時、通常の+=は遅いから[]byteをappendした方が高速という話があったので、実際にどの程度の差が出るのか検証してみた。 Goでは文字列連結はコストの高い操作 - Qiita テストケース 以下のような9文字*10要素の文字列の配列要素を","で結合し、最後に","を追記するコードを実装した。得たい出力はstringなので、[]byteやbytes.Bufferを使う場合、最後にstringへのキャストを実行した。 var m = [...]string{ "AAAAAAAAA", "AAAAAAAAA", "AAAAAAAAA", "AAAAAAAAA", "AAAAAAAAA", "AAAAAAAAA", "AAAAAAAAA", } func BenchmarkAppendOperator_(b *testing.B) { for i := 0; i <

    Goの文字列結合のパフォーマンス - Qiita
    akatakun
    akatakun 2018/03/09
    ループ内で+演算子使うと毎回アロケーション走るけど、ループ使わずにハードコーディングすれば1回なんだ
  • go標準のbenchmark機能の使い方 - Qiita

    ReadMeFirst golangには、関数のbenchmarkを行うパッケージ・ユーティリティが標準で含まれています。 今回はgoで関数単位でのbenchmarkをとる方法について書きます。 testの基的な実行方法については、前記事を参照。 ベンチマークするテスト関数を作る testing package の benchMark用の 構造体を使います。 Benchmark関数は以下のように宣言します。(規約) package main import ( "fmt" "testing" ) func BenchmarkAppend_AllocateEveryTime(b *testing.B) { base := []string{} b.ResetTimer() // Nはコマンド引数から与えられたベンチマーク時間から自動で計算される for i := 0; i < b.N; i+

    go標準のbenchmark機能の使い方 - Qiita
    akatakun
    akatakun 2018/03/07
    アロケーション関連のデータも取れる
  • Goでアロケーションに気をつけたコードを書く方法 : DSAS開発者の部屋

    GoPythonのようなLLと比べると実行速度は速いのですが、GCは特別速いわけではないので、相対的にGCがパフォーマンスに与える影響は大きくなります。 また、Java に比べると、一時オブジェクトなどのために頻繁にヒープアロケーションを行うとGCの停止時間が長くなりがちですが、一方でヒープアロケーションを避けたプログラミングがしやすい言語でもあります。 MySQL ドライバのような低レイヤーのライブラリを作る場合、アプリケーション側の性能要件を勝手に決めることができないので、現実的な範囲でアロケーションを減らす努力をするべきです。 ということで、前回の記事 で紹介したプレースホルダ置換を実装するにあたって経験した、アロケーションに気を使ったプログラミングについて、チューニングする手順やコード上のテクニックを紹介したいと思います。 1. まずは正しく動くものを作る go-sql-driv

    Goでアロケーションに気をつけたコードを書く方法 : DSAS開発者の部屋
    akatakun
    akatakun 2018/03/07
    実行速度は速いが、GCは特別速いわけではないので、アロケーションはなるべく減らす,benchcmpで比較し、コミットログに含める,[]byteとstringの間の変換でアロケートとコピーが発生する
  • Go 1.2で追加されたコードカバレッジ解析ツールを使う - Qiita

    Help us understand the problem. What is going on with this article?

    Go 1.2で追加されたコードカバレッジ解析ツールを使う - Qiita
  • 1