D言語のenumの罠

新しく書いたBase64モジュールで,何故か配列を使ったテーブルマッピングを行うと劇遅になるという問題に遭遇.その犯人は… @s50先生の次回作にご期待下さい.
3
SKSの申し子 @repeatedly

@s50 配列使うと100以上遅くなった > decode

2010-10-10 06:18:40
SKSの申し子 @repeatedly

でもencodeは普通に配列の方が速いんだよねぇ.よく分からん…

2010-10-10 06:19:25
IGARASHI Shinji@無職 @s50

@repeatedly テーブルの定義位置をBase64Implの直下にしてもテーブル遅かった?

2010-10-10 07:00:16
IGARASHI Shinji@無職 @s50

@repeatedly 手元だとテーブル使う奴が圧倒的に速い……

2010-10-10 07:21:10
IGARASHI Shinji@無職 @s50

うぶんちゅとまっくになんの違いがあるんだー?

2010-10-10 07:21:36
IGARASHI Shinji@無職 @s50

なにか間違ってるんかのう

2010-10-10 07:22:40
SKSの申し子 @repeatedly

DecodeMap = ['A':0 .. '=':-1];を用意してdecodeMap(*srcptr++);をDecodeMap[*srcptr++];に変更するだけで,1000_0の繰り返しで0.5msecが30msecまで遅くなる.

2010-10-10 07:47:35
SKSの申し子 @repeatedly

Windowsでもテーブルの方が遅い…

2010-10-10 08:02:59
SKSの申し子 @repeatedly

テーブルの方がなんで速いのかはコード見てみんと分からん…

2010-10-10 08:03:22
IGARASHI Shinji@無職 @s50

@repeatedly いちおー差分。だうんろーどしてpatch <ideone_QLY3Y.txtして-inline付けてコンパイルすっとこっちと同じ条件になるー。 http://ideone.com/QLY3Y

2010-10-10 08:04:44
SKSの申し子 @repeatedly

enumをimmutableにしたら速くなった…

2010-10-10 08:06:17
SKSの申し子 @repeatedly

あれ,enumってなんでこんな遅いの?

2010-10-10 08:08:55
SKSの申し子 @repeatedly

enum -> static immutable -> immutableの順に速い.ローカルが速いのは分かるんだけど,enumが遅過ぎる…

2010-10-10 08:18:47
SKSの申し子 @repeatedly

結局遅かったんのは配列じゃなくてenumを使ってアドレスキャッシュに乗らなかったからかな?

2010-10-10 09:14:51
IGARASHI Shinji@無職 @s50

enumでどんなコード吐いてるのか確認してないのでなんともなあ。if並べた奴に負けてたってのは差がありすぎな気もする

2010-10-10 09:17:25
SKSの申し子 @repeatedly

@s50 さっきのテストコードのimmutableをenumにして見ると良いよ!

2010-10-10 09:18:54
IGARASHI Shinji@無職 @s50

enumにしてみたらギャグみたいにおせえええええええええ!?

2010-10-10 09:42:53
IGARASHI Shinji@無職 @s50

32MBのファイルの処理がおわらない……

2010-10-10 09:43:36
IGARASHI Shinji@無職 @s50

これ少なくともふつーの配列アクセスになってないんでなかろうか

2010-10-10 09:44:57
IGARASHI Shinji@無職 @s50

少なくとも連想配列的なアレか

2010-10-10 09:45:54
残りを読む(14)

コメント

Tsuyoshi CHO @tsuyoshi_cho 2010年10月10日
Dのenumはスレッドセーフになるようにしてるとか、なんか癖があるのかな?
0
SKSの申し子 @repeatedly 2010年10月11日
@tsuyoshi_cho enumには列挙体とは別に定数向けの単体enumがあって,どちらかというとCのdefineに近い感じなので,こういう動作も仕方ないのかなと.
0