トップ «前の日記(2016-08-01) 最新 次の日記(2016-08-21)» 編集

はじめてのにき

ここの位置付け

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|

ToDo:


2016-08-16

_ hescape

http://k0kubun.hatenablog.com/entry/hescape

あまり人の書いたものについてどうこう言いたくないし言ってもしょうがないし、飲み会で言うとかはともかくわざわざ書いたりもしないのだけど…もやもやするので言いたくなってしまった。別に自分のアプリで使ってるとかならどうでもいいんだけど、ruby gemになっちゃってるあたりと、なんとなく見てみるとはてぶたくさんついててかつ誰もコード読んでないぽいあたりで、もやもやが。特に後者

https://github.com/k0kubun/hescape

きちんと確認してないので、間違ってることもあるかもしれないです、が、一番ウーン、、、とおもった点を書いていきます。間違ってることがあると申し訳ないですが

  • const uint8_t* src と size_t size を受ける関数に関わらず、 src[size] == NULL であることを仮定している。 cruby では正しい前提ぽいんですが、かなり悪いインターフェイスだと思う。https://github.com/vmg/houdini はたぶんこの問題を持っていない
  • uint8_t* のインターフェイスについて何も伸べていない。 ruby >= 1.9 でかつ SJIS とか使ってるとたぶん即死ですよねこれ https://github.com/vmg/houdini はちゃんとUTF8以外サポートしていないと明示している
  • https://github.com/k0kubun/hescape/commit/e04b6f8c4a60c765f2eaf78f409b6f3d6ecef27c のパッチを受け入れた。これ一般的なケースで遅くなる気がして、実際僕の手元では遅くなってるし正直やらない方がいいという感覚が強い

ここからはより主観的かつnitpickな項目が多くなっちゃうのだけど、以下のような理由で上記のような点を修正すればOK、という気持ちになりにくいなあ…と思った

  • Round allocation up to multiple of 8. というコメント。コメントは何をしてるか、より何故これをしてるか、を書くべきで、このコメントは何故これをしているかが説明されてない。その上でバッファを1.5倍してるコードはまあわかるんだけど、こっちは意図がわからない。この問題は https://github.com/vmg/houdini からコードをコピペしたから起きてるんだと思う
  • append_ ではじまる二つの関数の引数が理解しづらい。これのおかげで未だに現在のコードのセマンティクスが正しいと確信が持てないでいます
  • 実アプリでテストしてる気配がない。個人的な意見だけどトレードオフのある速度最適化はちゃんと速くしたいものがある時にやるべきかなと。
  • テスト/ベンチのテストケース少なすぎ
  • *bufにmallocしたバッファを返すというインターフェイスなのだけど、これがmallocされたものかどうかは返ってきたサイズを見ないとダメで、それがドキュメントされてないのはイマイチな気がする。まあrubyの方では適切に処理されてるぽいから良いのでしょうけど
  • あとfind_escape_fastの修正の仕方も気にいらないというか、変化してる変数が3つになってて正直わけがわからない(←これは完全にウソでした…コメントに書きます)

あとなんだろう。HTML_ESCAPE_TABLEていうデータがあるんだけど、これ本当に速いんだろうか。。とか、気になることはまだあった気がする

(14:28)

_

この手の雑さ、気に入らないというよりむしろ親しみが持てる部分が多いというか、僕が適当に書いたコードはこういう感じになってることが多くて、しかも実際そのままほっておいたりするので、心苦しい

(16:34)

本日のツッコミ(全4件) [ツッコミを入れる]
_ kazuho (2016-08-16 15:15)

> find_escape_fastの修正の仕方も気にいらないというか、変化してる変数が3つになってて正直わけがわからない

この部分、picohttpparserだと意図的にそうしています。というのは、呼出元 (https://github.com/h2o/picohttpparser/blob/master/picohttpparser.c#L146) を見てもらえばわかるのですが、found と buf は返す必要ある(つまり変化する変数が2つはある)状態で、かつ、buf と buf_end の値を変えないままループカウントだけを減らしていく必要があると考えるからです。

変数の数を減らすことはもちろんできると思いますが、処理をループしないケースにむけて最適化すべきコードなので、そこを頑張るメリットがあるかは疑問です。

ただ、hescapeでの使い方は、picohttpparser のようにバイト毎で判断するコードの直前にSSEで書かれたスキップ用コードを差し込む、というきれいなものではないので、まあ...

_ shinh (2016-08-16 15:51)

すいません

https://github.com/k0kubun/hescape/commit/595fec241bbd260a68b42c435ac35575029108ca#commitcomment-18646207

で提案されてたコードをローカルでパッチした状態で眺めていました。3つ、というのはi,buf,lenの3つに16を足したり引いたりしてる状況を見て書いていました。現実に行なわれた変更は

https://github.com/k0kubun/hescape/commit/356c8878f6bb4acd5a1d2f9711b3450afce9d0e3

なので、僕の感覚ではpicohttpparser同様特に気にならないコードでした。

_ naruse (2016-08-16 16:34)

> https://github.com/k0kubun/hescape/commit/e04b6f8c4a60c765f2eaf78f409b6f3d6ecef27c のパッチ
懸念は理解できるんですが、これ手元のHaswellで−O3にしたら速くなったんですよね。まぁそもそもfind_escape_fastを速くすれば必要なくなると思いますが。

> あとfind_escape_fastの修正の仕方も気にいらないというか、
わたしだったらbufとbuf_curとbuf_endにして変化する変数減らすけど、まぁバグを直した後の改善は自分でやって欲しかったのだ。

> HTML_ESCAPE_TABLEていうデータがあるんだけど、これ本当に速いんだろうか。。
今だとswitchの方が速いんじゃないかなと思うけど、この辺もstr_blankの例を見つつがんばって欲しいなと思いました。

_ Anna (2020-05-05 17:48)

https://bacsitructuyen.net

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

2016年
8月
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 31
1.Anna(2020-05-05 17:48) 2.naruse(2016-08-16 16:34) 3.shinh(2016-08-16 15:51)
search / home / index

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

shinichiro.hamaji _at_ gmail.com / shinichiro.h