Cより速いCommon Lisp

メモ的に。Common Lispはナンデモあり。
8
fukamachi @nitro_idiot

Posted to Hatena Blog Cより高速なCommon Lispコードを書く - 八発白中 blog.8arrow.org/entry/2014/10/…

2014-10-23 06:30:53
fukamachi @nitro_idiot

Common Lispは、チューニングしたプログラムをREPLで部分コンパイル→ベンチマーク→良くなってたらコミット→さらにチューニング、のサイクルがかなり速く回せるのも高速なプログラムを書くのに向いているな、と思った

2014-10-23 17:50:31
fukamachi @nitro_idiot

Cのhttp-parserの最適化オプションを直して、fast-httpをさらに高速化したら、Common LispがCの1.7倍速くなって不気味なので誰か間違いがあったら指摘してほしい github.com/fukamachi/fast…

2014-10-26 19:18:26
fukamachi @nitro_idiot

「普通に考えてCommon LispがCより遅くなるわけがない」と言って即座に同意を得られるあたり最高のコミュニティ #lispmeetup

2014-10-30 00:21:44
fukamachi @nitro_idiot

もし速度の面でCommon Lispを疑うのなら、なぜCLはCより速くなり得たか、そしてそれが一般的であると言える理由、Cのhttp-parserをさらに高速化する方法とそれが現実的に難しい理由、などを11月末の #lispmeetup でお話しますのでぜひお越しください

2014-10-30 01:18:52
Kazuho Oku @kazuho

僕が普通に HTTP パーサ書くと picohttpparser になって、たぶんそれより速い実装はどのプログラミング言語であっても相当に困難だろうと思ってる

2014-10-30 14:34:37
Kazuho Oku @kazuho

一方では、Cだと文字列と連想配列を含む大域的な最適化を行いにくい、っていうのは事実としてあったりするから、どういう発表になるか気になる

2014-10-30 14:35:52
Kazuho Oku @kazuho

というわけで、C言語を用いた高速なHTTPパーサとサーバ実装の具体例については来週月曜の #http2conf で話しますのでよろしこ

2014-10-30 14:37:47
Kazuho Oku @kazuho

高速なコードを書く際に意識すべきことって、基本的に、処理完了までに実行される命令数と、パイプラインをストールしないこと、の2点だと思ってる

2014-10-30 14:40:34
Kazuho Oku @kazuho

picohttpparserについていうと、HTTPリクエストの5割以上の部分で1オクテットについて高率で予測が当たる条件分岐1回にまで抑え込んであるので、速さには一定の自信をもっているのです。SIMD化も割と簡単にできるとは思うけど、そこまでする必要がないのでやってない

2014-10-30 14:54:03
fukamachi @nitro_idiot

kazuhoさんのpicohttpparserはかなり速いことが分かった。これに勝つにはリミッターを外さねばなるまい… (宣言を (safety 0)にしながら)

2014-10-30 20:00:00
fukamachi @nitro_idiot

Now fast-http is 2 times faster than C http-parser, and 1.2 times faster than picohttpparser.

2014-10-31 02:05:09
Kazuho Oku @kazuho

あっさり抜かれたw common-lisp と fukamachi さんすごいなぁ

2014-10-31 04:20:50
Kazuho Oku @kazuho

@nitro_idiot 試してみたのですが、fast-httpのページにあるpicohttpparserの測定結果がおかしいような気がしました。手元だと gist.github.com/kazuho/5f1c4c0… のように4倍ほど速い結果になります

2014-10-31 05:41:24
Kazuho Oku @kazuho

仮に測定ミスだったとしても fast-http のほうが高位のレイヤで必要な処理をいろいろやってるし、とても高速なパーサであることは変わらんと思うけど

2014-10-31 05:45:34
Kazuho Oku @kazuho

それとも僕の方がなにか再現に失敗してるかな

2014-10-31 05:47:30
fukamachi @nitro_idiot

@kazuho おっと、僕の環境でも同じ結果になりました。picohttpparser.o を使って計測していたんですが、.cのほうが正しいですか?

2014-10-31 05:52:58
Kazuho Oku @kazuho

@nitro_idiot あー、make test で作られる .o を使ったとしたら、最適化されてませんね。これは混乱しますね。すみません

2014-10-31 05:54:11
Kazuho Oku @kazuho

つーか、make したら test が動いてテスト用の .o ができてるじゃん。すみませんすみません

2014-10-31 05:59:29
fukamachi @nitro_idiot

.@kazuho pointed out the benchmark was using a wrong object file. It's 3.7 times faster than fast-http. Amazing.

2014-10-31 06:04:21
fukamachi @nitro_idiot

Perhaps I need to rewrite http-parse-headers aggressively to make it even faster. I'm not sure it will be 4 times faster, though.

2014-10-31 06:44:44