トップ «前の日記(2011-05-31) 最新 次の日記(2011-06-06)» 編集

はじめてのにき

ここの位置付け

2004|11|
2005|03|04|05|06|07|08|09|10|11|12|
2006|01|02|03|04|05|06|07|08|09|10|11|12|
2007|01|02|03|04|05|06|07|08|09|10|11|12|
2008|01|02|03|04|05|06|07|08|09|10|11|12|
2009|01|02|03|04|05|06|07|08|09|10|11|12|
2010|01|02|03|04|05|06|07|08|09|10|11|12|
2011|01|02|03|04|05|06|07|08|09|10|11|12|
2012|01|02|03|04|05|06|07|08|09|10|11|12|
2013|01|02|03|04|05|06|07|08|09|10|11|12|
2014|01|02|03|04|05|06|07|08|09|10|11|12|
2015|01|02|03|04|05|06|07|08|09|10|11|12|
2016|01|02|03|04|05|06|07|08|09|10|11|12|
2017|01|02|03|04|05|06|07|08|09|10|11|12|
2018|01|02|03|04|05|06|07|08|09|10|11|12|
2019|01|02|03|04|05|06|07|08|09|10|11|12|
2020|01|02|03|04|05|06|07|08|09|10|11|12|
2021|01|02|03|04|05|06|07|08|09|10|11|12|
2022|01|02|03|04|05|06|07|08|09|10|11|12|
2023|01|02|03|04|05|06|07|08|09|10|11|12|
2024|01|02|03|04|05|06|07|08|09|10|11|

ToDo:


2011-06-02

_ FizzBuzz conference

http://partake.in/events/8c2cd95b-b6d4-4d9f-917e-a98ba9aafd25

僕の中では人類 vs ksk という感じだった。 フタを開けてみると人類善戦したなーという感じもあったけど、 まぁ 50B はすごく良いものだった。

もうちょいなんか準備してこいよという感じだったけど、 まぁなんか適当に紙とかにみんな書いてくれて良かった。 意外と人数いたあたりのがあれだった。

hirose さんが関西の方だということなんで 汚ない家に来てもらったり。 色々と教えてもらって僕はありがたかったんだけど、 環境としてはネカフェの方が良かったろうなーとか思った。 あとで予備の布団がカビくさい気付いてそっちも申し訳なかった。 てか干さなんと。しかし梅雨

(00:45)

_ Array#bsearch

http://twitter.com/#!/mametter/status/75937905503248385

なんかこのへんでまた話がされてるみたいだった。 前も書いたかもだけど個人的にはすごく欲しい…

RArray に is_sorted みたいな bitfield ぶちこんでしまうってのは 無理なんだったっけ…

(00:49)

_ objdump -S

http://twitter.com/hotpepsi/statuses/74847188701818880

objdump -x とかはともかく、 -S くらいは普通の linux 上で C/C++ 書いてるプログラマは 年に数度くらいは必要になったりあった方が便利になる気がするっていうか、 知らない/使えない/使わないのは損かなぁと思う。 「linux 上で C/C++ 書いてるプログラマ」が普通でない…ってこともないよねたぶん。

なんかごく最近 objdump -S を普通の用途で使った。 なにやら

static Mutex mu;
mu.lock();
// foobar
mu.unlock();

みたいなコードを見て、「これたぶん mutex 2回はる感じになるんですよねー」 とか言ってて、しかし本当だっけか…ってことで

#include <stdio.h>

struct C {
  C() {
    puts("C");
  }
};

void func() {
  static C c;
}

int main() {
  func();
  func();
}

みたいなコードを書いて、 objdump -S したら __cxa_guard_acquire とか出てきたので、 ああやっぱり、とか言ってたのだった。

しかしあとでよく objdump -S の出力を見ると、

  400760:       48 83 ec 18             sub    $0x18,%rsp
  static C c;
  400764:       80 3d dd 04 20 00 00    cmpb   $0x0,0x2004dd(%rip)        # 600c48 <guard variable for func()::c>
  40076b:       74 0b                   je     400778 <func()+0x18>
  40076d:       48 83 c4 18             add    $0x18,%rsp
  400771:       c3                      retq
  400772:       66 0f 1f 44 00 00       nopw   0x0(%rax,%rax,1)

って感じのコードが吐かれていて、 <guard variable for func()::c> ってやつがノンゼロならロックもなんもせずに 抜ける感じになっていた。

つまりロックの中で <guard variable for func()::c> ってのを ダブルチェックしつつ更新してくれるから大丈夫みたいなコードになってるんだろうなぁ と。

で、 objdump -S のおかげで関数内にコンストラクタのある型の static 変数がある場合に、 一度しか実行しないことを保証するためのコストが高いかと思ったら そうでもない、ってことがわかったのだった。

今回はまぁ単に気分で追っかけただけだけど、パフォーマンスとかが重要な時は まぁ普通に知りたい情報だと思う。

(01:50)

本日のツッコミ(全6件) [ツッコミを入れる]
_ naruse (2011-06-02 01:16)

先日はどうも、とても楽しかったです。
Array#bsearch みたいなのが欲しかったら是非応援のお便りを……。
ユースケースがあるとなおよろしいです。

_ mame (2011-06-02 08:17)

応援のお便り待ってます!
is_sorted は要素を破壊的に書き換えた場合に sorted じゃなくなるのの検知が難しいです。

  ary = [[3],a=[2],[1]]
  ary.sort! # 一旦 sorted
  a[0] = 4 # ary と直接関係ないイベントで sorted じゃなくなる

あとは <=> の再定義とか。

_ naruse (2011-06-02 12:11)

> is_sorted は要素を破壊的に書き換えた場合に sorted じゃなくなるのの検知が難しいです。
そう? rb_ary_modify() 内でis_sorted フラグをクリアすればいいんじゃないかな。
rb_str_modify で coderange をクリアするようなもので。
<=>の再定義はどうしようもないけど

_ mame (2011-06-02 19:51)

よく見るんだ。sorted なのは ary 、破壊的に変更されるのは a です。

_ hirose (2011-06-02 20:05)

先日は泊めてもらって本当にありがとうございます。
色々話を聞けて、すごく楽しくて、最高でした!

_ naruse (2011-06-02 22:13)

> よく見るんだ。sorted なのは ary 、破壊的に変更されるのは a です。
あー、なるほど。世の中難しいですねぇ

お名前:
E-mail:
コメント:
人生、宇宙、すべての答え
本日のリンク元

2011年
6月
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30
1.shinh(2011-06-26 15:08) 2.kinaba(2011-06-25 09:30) 3.naruse(2011-06-02 22:13)
search / home / index

全てリンクフリーです。 コード片は自由に使用していただいて構いません。 その他のものはGPL扱いであればあらゆる使用に関して文句は言いません。 なにかあれば下記メールアドレスへ。

shinichiro.hamaji _at_ gmail.com / shinichiro.h