生涯未熟

生涯未熟

プログラミングをちょこちょこと。

Goの勉強会を開催してみました

エンジニア人生の中で初めて勉強会なるものを主催してみました。

gounconference.connpass.com

なんでやったの?

Go界隈ってあんまり勉強会開催されてないんですよね。
なんか好きな言語の勉強会があんまり無い状況ってのも寂しいので、自分でやってしまおうと。

あと、なんかラフな感じでGoのことを喋る勉強会ってのが一つくらいあってもいいかなと。

やってみてどうだった?

ひたすらに疲れました・・・
勉強会を主催してる人達すげぇなってのが改めて分かりました。

もう一つ、キャンセルされると予想以上に凹むなってことも分かりました。

今後

今後も定期的に、あまり間を空けずにやっていこうかなと思っています。
レベル関係なく参加しやすい勉強会を目指して頑張ります。

ということで、今月2回目を開催するのでよければ是非。

gounconference.connpass.com

lock-freeを考える

考える発端となったのは以下の記事。

stackimpact.com

GoのPerformance Turningに関する記事なのだが、気になる項目が。

Favor lock-free algorithms

ふむ🤔

www.slideshare.net

ほう?🤔

MutexやSemaphoreで排他制御を行なうのではなく、CASなどを使ったlock-freeを実装した方が良いらしい。

CAS

値の書き換えが想定通りのものなら、実際に書き換えを行なう。
書き換えが出来るまで、何度でも繰り返す。
→ 但し、問題もある(ex. ABA問題

上記のCASは有限のステップ数で処理が完了しないため、lock-freeではあるがwait-freeではない。

Goの場合はどうやるの?

Goの場合、atomicパッケージにCAS実装がある。

atomic - The Go Programming Language

package main

import (
  "sync"
  "fmt"
)

var (
  balance int32 = 100
  wg = sync.WaitGroup{}
)

func main() {
  // expect: balance = 55
  var i int32
  for i = 0; i < 10; i++ {
    wg.Add(1)
    go withdraw(i)
  }
  wg.Wait()
  fmt.Println(balance)
}

func withdraw(amount int32) {
  balance = balance - amount
  wg.Done()
}

しかし、この方法だと当たり前だがgoroutineの処理タイミングによって全く違った値が算出される。 そこで、以下のようにCASを用いる。

package main

import (
  "sync"
  "fmt"
  "sync/atomic"
)

var (
  balance int32 = 100
  wg = sync.WaitGroup{}
)

func main() {
  // expect: balance = 55
  var i int32
  for i = 0; i < 10; i++ {
    wg.Add(1)
    go withdraw(i)
  }
  wg.Wait()
  fmt.Println(balance)
}

func withdraw(amount int32) {
  for {
    if atomic.CompareAndSwapInt32(&balance, balance, balance - amount) {
      break
    }
  }
  wg.Done()
}

すると、想定した55の値が常に算出される。

Mutexの中身は・・・

結局、CASを使っていたりする。

// Fast path: grab unlocked mutex.
if atomic.CompareAndSwapInt32(&m.state, 0, mutexLocked) {
  if race.Enabled {
    race.Acquire(unsafe.Pointer(m))
  }
  return
}

パフォーマンスの差異

実際にパフォーマンスに違いは出るのだろうか? ベンチマークを取ってみる。

  • old: use Mutex
  • new: use CAS
benchmark         old ns/op     new ns/op     delta
BenchmarkDo-4     4028          3670          -8.89%
BenchmarkDo-4     4000          3683          -7.93%
BenchmarkDo-4     4014          2934          -26.91%
BenchmarkDo-4     3516          3043          -13.45%
BenchmarkDo-4     2759          3660          +32.66%
BenchmarkDo-4     4030          2883          -28.46%
BenchmarkDo-4     4025          3802          -5.54%
BenchmarkDo-4     4027          3358          -16.61%
BenchmarkDo-4     4046          3602          -10.97%
BenchmarkDo-4     3749          3363          -10.30%

全体的に早くはなっているが、たまに致命的に遅くなる。

さて、実行するgoroutineの数を増やすとどうなるのだろうか?

  • 1000
benchmark         old ns/op     new ns/op     delta
BenchmarkDo-4     271236        266445        -1.77%
BenchmarkDo-4     275415        267188        -2.99%
BenchmarkDo-4     269019        269459        +0.16%
BenchmarkDo-4     272291        271073        -0.45%
BenchmarkDo-4     273410        269671        -1.37%
  • 10000
benchmark         old ns/op     new ns/op     delta
BenchmarkDo-4     2782914       2831663       +1.75%
BenchmarkDo-4     2712926       2936499       +8.24%
BenchmarkDo-4     2748464       2891509       +5.20%
BenchmarkDo-4     2810436       2844462       +1.21%
BenchmarkDo-4     2738268       2875502       +5.01%

む?なんか段々とMutexに負けてるぞ🤔
何故だ・・・

結局どうすりゃいいのか?

多大なコア数を持つCPUでないと、CASなどのlock-freeの効果は薄そう。
以下のリンク先にも書いてあるが、実際に80coreで動かした場合にMutexがボトルネックになったようである。
そういう時にはlock-freeを使う意味が出てきそう。

texlution.com

映画感想:「ファウンダー ハンバーガー帝国のヒミツ」

thefounder.jp

映画館で予告編を見てから、観たいな〜と思っていたのがやっと実現できました。

一言で言うと

レイ・クロックがクズ

と叫びたくなるような映画でした。

概要

1954年アメリカ。52歳のレイ・クロックは、シェイクミキサーのセールスマンとして中西部を回っていた。
ある日、ドライブインレストランから8台ものオーダーが入る。どんな店なのか興味を抱き向かうと、そこにはディック&マック兄弟が経営するハンバーガー店<マクドナルド>があった。
合理的な流れ作業の“スピード・サービス・システム”や、コスト削減・高品質という革新的なコンセプトに勝機を見出したレイは、壮大なフランチャイズビジネスを思いつき、兄弟を説得し、契約を交わす
次々にフランチャイズ化を成功させていくが、利益を追求するレイと、兄弟との関係は急速に悪化。やがてレイは、自分だけのハンバーガー帝国を創るために、兄弟との全面対決へと突き進んでいくーー。

(公式サイト様より引用)

レイ・クロックのクズっぷり

52歳でシェイクミキサー売りをしているところから分かるように、レイ・クロックは冒頭で苦労人として描かれています。
この時点では「レイ・クロックがんばえ〜〜〜」と、プリキュアを応援する子供たちさながらの純粋さで観ていたのですが、物語が後半になるにつれて「オイオイオイオイ、クズだぜコイツ」というような事態が巻き起こっていきます。

増長っぷりがクズ

創始者であるマクドナルド兄弟を差し置いて、増長していくレイ・クロックがもう観ていて爽快なくらいで、勝手に店舗数拡大するわ、マクドナルド兄弟が良しとしない商品改良をするわともう色々とやらかすんですよ。
で、マクドナルド兄弟が制止に入ると逆ギレする始末。とんでも人財やないか。

他人の成功が増長を生む

よくある話なんですが、自分が目をかけた他人が成功すると人は「ワシが育てた」とばかりに、何故か自分まで成功したかのような錯覚に陥るんですよね。
一種のイケア効果みたいなものですが、更に成功した人から「あなたのおかげです」なんて言われちゃ、そりゃ増長もしちゃいます。

女性関係も破茶目茶

後半、ずっと支えてきた奥さんに対して飯を食いつつ「離婚してくれない?」って、さすがに増長が過ぎませんかねレイ・クロック氏。
そして、自分は気になっていた他人の奥さんを略奪・・・破茶目茶やな〜。

ビジネス面はやっぱり凄い

ただ、ビジネスマンとしては本当に凄いと思うんですよね。
単純に野心のあるだけの無能が、同じことをしてもこの世界中に店舗がある世の中は生み出せなかったと思うのです。

運に依るものもありますが、それでも在職中に「世界34か国、8300店舗を展開」なんてのは元々の能力が高くなければ出来ない所業ですよ。

こんな感じの映画でした。
監督のジョン・リー・ハンコック氏が前回メガホンを撮った「ウォルト・ディズニーの約束」が、あまりツボを外していなかったのでこちらも安心して観ることが出来ました。
敢えて言うなら、最初から最後に至るまでのカタルシスが薄く、鑑賞後の後味が薄いってことぐらいでしょうか。

次は何の映画観ようかね🤔

成功はゴミ箱の中に レイ・クロック自伝
プレジデント社 (2017-05-09)
売り上げランキング: 9,543