生涯未熟

生涯未熟

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

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

私はこれでSNSをやめました

厳密に言うとSNSの積極的な利用をやめました。

きっかけとしては、人に教えて頂いたこのエントリでした。

dev.to

この記事を読んで「たしかに自分はSNSを使って何をしたかったのか?」と考えた末に、メリットよりもデメリットの方が大きいと判断し、やめるに至りました。

Twitterは自分にとって利用価値の高い情報を得るには都合が良く、知らない方との繋がりを生むこともある素晴らしいプラットフォームであると思います。

しかし、その価値のある情報を見つけるためにどれだけのノイズを目にしなければいけないでしょうか?
インターネット上での人との出会いは多ければ多いほど素晴らしいものなのでしょうか?

こういった疑問に対して、考えていきます。

情報について考えてみる

まずは情報について考えてみましょう。

Twitterを利用するにあたり、「欲しい情報」と「要らない情報」を分別してみました。

  • 欲しい情報:心にポジティブな影響を与える情報、知識への変換効率の高い情報、領域外のセレンディピティ的情報、知己の情報
  • 要らない情報:心にネガティブな影響を与える情報、知識へ変換出来ない情報、既知の情報、感心の無い人物の情報

上記に挙げた欲しいと思う情報は、大体の方は同じく欲しいと思う情報でしょう。要らない情報についても同じく。

さて、ここまでこの記事を読まれた方は「最近、欲しい情報を得た経験」をしましたでしょうか?
人によってはパッと頭に思い浮かぶかもしれません。それでは、思い浮かんだ方は次のことを考えてみて下さい。
「あなたはその情報を手に入れるまでにどれだけの時間を浪費しましたか?」

欲しい情報を手に入れるまでにかかるコストは少なくないということに気付きましたでしょうか。
果たして手に入れた情報はそこまでのコストを払ってまで得たかった情報でしたか?
今一度振り返って考えてみましょう。

また、要らない情報には自己の精神性に傷を付けるようなものもあり、情報を得ようとした結果、マイナスの影響を得るだけになってしまいます。
私の場合、エンジニアリングに関わる人々から積極的に情報を得ようとしていましたが、結果彼らの法的意識の低さなどにイライラすることも多々ありました。

Twitterのような受動的情報収集は現代における砂金採りのような印象を覚えます。
入ってくる100個の情報の内、1個でも素晴らしい情報があれば読み続けてしまう、という点をJoel Spolsky氏は「犬の躾」と表現されたのでしょう。
SNSは情報収集のツールとして無用の長物とは必ずしも言えませんが、非効率なため今ひとつ使い勝手に欠ける、と改めて気付かされました。

p-shirokuma.hatenadiary.com

こちらのエントリでは、「如何にノイズをコントロールするか?」といったことを論述されていますが、
コントロールにかかるコストと得られる情報の価値はトレードオフであるため、それならば敢えてネットライフの一部分を削ってみよう、 というのも情報爆発の現代において選択肢の一つとして有りなのかもしれません。

インターネット上での他者との交わり

Twitterにおける情報収集ツールとしての役割について、ノイズコントロールに非常にコストがかかり、非効率であるということは分かりました。
それでは、他者との交流という観点から見てみるとどうでしょうか?

過去を振り返ってみると、Twitterをきっかけに関わりを持ち、現在に至るまで交友関係を保っている方もいます。
そして、それが自分にとってプラスに働いたことは確かにあります。

しかし、そのおかげで他人の動向が気になるためTwitterから離れられなくなった、ということもまた事実でした。
自分自身の神経質な性質が災いしてか、流れてくるフィードに対して釘付けになってしまうという悪癖を生み、そこから集中力の低下・余計な情報のインプットといった悪循環を生み出していました。

こういった自分と他者という構図に身を置いた時、人は様々な感情が昂まります。

「他人の言動から前向きになりたい、多様な創作物から自己のクリエイティビティを刺激したい」というポジティブな感情から、「他人に認めてもらいたいといった承認欲求、他人を貶めたいというディスリスペクトな気持ち」というネガティブな感情といったものなど様々な感情が呼び起こされます。

そのような他者のアウトプットから影響を受け、人は行動の原動力としますが、基本的にはポジティブなインプットからはポジティブな行動・ネガティブなインプットからはネガティブな行動しか誘発されません。

さて、ここでJoel氏が仰る

残念なことだが、友人の大部分はTwitterでハッピーなニュースをシェアしたり、近況がどうなのか教えたりしませんでした。
(Unfortunately, those friends mostly didn’t use Twitter to share happy news and tell me how things were going.)

ということを考えてみましょう。

人間はどうやらポジティブな情報よりもネガティブな情報を好む性質があるため、どうしてもネガティブなインプットを受け取ってしまい、自分もネガティブなアウトプットをしてしまいがちです。

上記のポジティブ、ネガティブの人間に与えるインパクトに関しては以下の論文に詳しく書いております。興味のある方はご一読を。
Asymmetrical Effects of Positive and Negative Events: The Mobilization-Minimization Hypothesis

こういったネガティブな情報も一歩引いた目線でキチンと知識に変換出来る人物なら、上手くSNSを使っていけるのでしょうが、私には無理でした。
どうしてもネガティブな情報をそのまま受け取ってしまい、怒りや悲しみといった感情に変換され、辛くなってしまいます。

また、他者との交流の一端としての「議論」という面をとってみてもTwitterは文字数制限という、情報を伝える上で非常に厄介な制限があるため、議論を行うことは困難でしょう。
Joel氏もこの問題について以下のように述べています。

Yeah, I get it, this 140 character limitation was just a historical accident,
and now it’s 280 characters anyway, and you can always make a Twitter Story,
but the flame wars on Twitter emerged from the fact that we’ve taken a medium, text,
which is already bad at conveying emotion and sentiment and high-bandwidth nuance,
and made it even worse, and the net result is a lot of outrage and indignation.

ここまで考えて

果たしてSNSが齎したものは一体何だったのでしょうか?
無意味に愚にもつかない争いを引き起こし、人々に厄難を降りかけただけなのではないだろうか。

皆さんも一度、SNSから遠ざかってみると気付くことがあるかもしれません。

御清覧ありがとうございました。