ブックマーク / qiita.com/chimatter (2)

  • sort.Slice に学ぶ高速化のヒント - Qiita

    sort.Slice の実装をかいつまんで紹介し、様々な型 (特に様々なスライス型) を受け取りつつ速度を落とさず処理をするヒントを探ってみようと思います。 Go 1.8 から追加されている sort.Slice は、従来の sort.Sort と同等の速度で動作します。 気になるのが、sort.Slice には様々な型のスライスを渡せるのに、要素の交換についての処理をユーザーが記述しなくても良いということです。 // 従来の sort.Sort では、ソート対象に関する操作を定義して sort.Interface として渡している。 type ByValue []string func (s ByValue) Len() int { return len(s) } func (s ByValue) Swap(i, j int) { s[i], s[j] = s[j], s[i] } fu

    sort.Slice に学ぶ高速化のヒント - Qiita
    cocoasynn
    cocoasynn 2017/12/22
  • 高速で汎用的なスライスの操作を求めて - Qiita

    高速に、汎用的に、スライスのフィルタリングをしたい。 仮に邪悪なことに手を染めることになっても。 この投稿では… この投稿は、以前投稿した sort.Slice に学ぶ高速化のヒント をスライスのフィルタリングの実装に適用してみた、という内容になっています。 (この投稿はチュートリアル的な内容となっています) 汎用的な処理を実現するにはリフレクションの力が必要ですが、それだけでは低速になってしまいます。 この投稿では、リフレクションでの実装から始まり、段々と高速な実装にしていきます。 その経緯で少しだけ道を踏み外します。 注意書き 一部、unsafe な機能を使っています。 来は、言語のメモリモデルにそって注意深く実装すべきものです。 が、今回はネタということで、無鉄砲に実装していきたいと思います。 リフレクションで解決してみる まず最初に、どのようなスライスでもフィルタリングできるよう

    高速で汎用的なスライスの操作を求めて - Qiita
    cocoasynn
    cocoasynn 2017/12/04
  • 1