Entries from 2008-06-01 to 1 month

C++ でバイナリイメージと type_info から型を (変換しながら) 組み立て

動いた。coderepos に上げた (http://coderepos.org/share/browser/lang/cplusplus/reflection/trunk/memrebuild.hpp) こんな感じでいいんじゃないかな。まだコンパイルしてないけど。 template <typename T> struct instantiator { virtual ~instantiator() {} T (*get(</typename>…

PostgreSQL におけるタイムライン処理

PostgreSQL 8.3 で ORDER BY ... LIMIT の処理が最適化されるようになったらしい。 ORDER BY ... LIMIT をソートしないで処理するようにした PostgreSQL 8.3 に関する技術情報 - SRA OSS, Inc. 日本支社 参考: Kazuho@Cybozu Labs: フレンド・タイムライン処…

コンパイルタイムにリスト構造作ってルックアップ

コンパイル時に typedef linked_list<int_pair<1, 'a'>, linked_list<int_pair<2, 'b'> > > tbl;みたく変換テーブル (1 => a, 2 => b) を構築してルックアップするってのを何となく書いてみた。リンクリストだけど定数のルックアップならコンパイル時に解決できるから O(0) だぉ。って使えなさ</int_pair<2,></int_pair<1,>…

MySQL と multi-statement SQL injection

複文が利用できるデータベースの調査: SQL Serverが狙われるには理由がある - 徳丸浩の日記(2008-05-02) の件だけど、MySQL のプロトコルは multi-statement をサポートしている。(参考: http://forge.mysql.com/wiki/MySQL_Internals_ClientServer_Protocol…

スタックマシンとかレジスタマシンとかって

元の議論把握してないけど、命令セットアーキテクチャにおいて、 オペランドを明示的に指定するのがレジスタマシン オペランドがスタックトップとかに固定されてるのがスタックマシン なんじゃないの? 実際に変数をレジスタに割り付けするかとか関係なく。

バイト数が定数の memcmp

$ C -cO3 -S -e 'return memcmp(argv[0], argv[1], 1024);' (snip) movl $1024, %ecx cld repz cmpsb mov $0, %eax je 0f movzbl -1(%esi), %eax movzbl -1(%edi), %ecx subl %ecx,%eax 0: (snip)ちょwww マジですかorz

ToDo

以下の速度感を把握する context switch syscall unix socket tcp socket syscall については BYTE UNIX benchmark とかで出るけど、あれは close(dup(0)) だし、純粋なオーバーヘッドじゃないので注意が必要。

Mac OS X で pthread_mutex_lock と pthread_mutex_unlock の回数がずれる話

2059 回 lock (wait からの復帰も含まれる) され 59 回 wait し 2000 回 unlock され 1966 回 block したことがわかります pthread でキューを作る(再挑戦)。ついでに dtrace でスレッドの解析 - IT戦記 pthread_mutex_lock = pthread_cond_wait + pthread…

InnoDB の insert buffer

INSERT 処理のスループットについて、ユニーク制約のないインデックスについては、ディスクに落ちてても大きな問題にならないらしい。 逆に言うと、セカンダリインデックスについては、無駄に UNIQUE とかつけるべきではない。 9.4.4. Issues with the Inser…

mysql_direct_access でクライアントと直接会話する方法

結局文字列型の UDF として定義して、SELECT binary direct_udf_func(binary args); みたいな感じでバイナリデータをクライアントとやり取りすればいいだけの話かと思った。 #これで文字コード変換スキップできた... はず... たぶん...

MySQL のストアドプロシージャとバイナリプロトコル

InnoDB の数値がクライアントに送信されるまで - kazuhoのメモ置き場 の続き。で、MySQL のサーバサイドプリペアードステートメントを有効化すると、バイナリ転送が行われるようになるんだけど、これは「使うな」という人もいる。参考: Prepared Statements,…

memcpy 最適化

バイト単位でコピーするアホなコードの方が、勝手にベクトル化される分、gcc 内蔵のヤツより最大3倍高速なんだってwww memcpy() compiled with vectorizing compilers All current compilers for linux should support SSE2 auto-vectorization with #inclu…

InnoDB の数値がクライアントに送信されるまで

InnoDB から MySQL コアへ4バイトコピー 数値としてロード (RISC 系のみ) 数値をテンポラリバッファへ文字列化 (除算は桁毎に1回) 文字列の先頭を揃えて memcpy 数値の文字列を行バッファへ追記 行バッファを転送データバッファへ追記 送信 うーん...追記:…

Returning result sets from stored procedures

32.4.14: Can MySQL 5.1 stored routines return result sets?Stored procedures can, but stored functions cannot. If you perform an ordinary SELECT inside a stored procedure, the result set is returned directly to the client. You need to use t…

MySQL の UDF は遅いんじゃないかという話

Kazuho at Work: Performance of MySQL UDFs vs. Native Functionsほとんどの場合は気にする必要ないんじゃないかなぁ。郵便局行ってから出社する。

MySQL ストレージエンジンに直接アクセスするストアドプロシージャ

詳細な説明はこっち: Kazuho@Cybozu Labs: MySQL (InnoDB) に直接アクセスしてタイムライン処理を高速化する話 コードはこっち: http://coderepos.org/share/browser/lang/sql/mysql_timelineストアドプロシージャっつーか、ぶっちゃけ UDF なんですが。 と…

MySQL ストレージエンジンへのダイレクトアクセス

前項 (タイムライン処理と SQL オプティマイザの可能性 - kazuhoのメモ置き場) の続き。一方で、アプリケーション開発者の立場から言うと、SQL オプティマイザをチューンするというのは迂遠すぎてやってられないわけで。なら、MySQL のストレージエンジンに…

タイムライン処理と SQL オプティマイザの可能性

re Kazuho@Cybozu Labs: フレンド・タイムライン処理の原理と実践SQL オプティマイザについての議論としては、たとえば、 SELECT * FROM message INNER JOIN follower ON message.user_id=follower.follower_id WHERE user_id=2 ORDER BY message.id DESC LI…

Re: One Response to “「フレンド・タイムライン処理の原理と実践」を追試してみた”

http://sklave.jp/logs/2008/06/10/re_friend_timeline_on_mysql/コメントに書いたことと、あとワーストケースのパフォーマンスの問題かなぁ、と思いました。単純なクエリは、実際には、 SELECT message.* FROM message INNER JOIN ( SELECT message.id FROM…

ウェブの食物連鎖

PHP プログラマ曰く「CSS なんてプログラミング言語じゃないよね。タンポポ (ry」Perl プログラマ曰く「PHP なんてテンプレート言語だよね。PHP でフレームワーク書くなんて (ry」SQL プログラマ曰く「Perl なんてグルー言語だよね。Perl でフレームワーク書…

タイムライン取得処理 (プル型) をがんばって1ステートメントで書いてみる話

Kazuho@Cybozu Labs: フレンド・タイムライン処理の原理と実践 http://tt25.org/blog/20080609/sql-friend-timelinett25 さんに触発されて MySQL で 2 * n2 行のアクセスで (たぶん) 動くコードを書いてみた、けど、ストアドプロシージャを使うコードと速度…

MySQL で binary log を使う3つの理由

MySQL で binary log を使う目的としては、何があるんだろ。 replication auditing recovery このあたりだろうか。Q4M の場合、キューはレプリケーションしても意味がない *1 ので、auditing と recovery 目的でバイナリログが求められるか否か、ということ…

Q4M の --with-sync=fdatasync における高速化

データを圧縮して保存するという手もあるなと思ったけど、(今は) やらないぉ #他の手としては delete をロギングするとか

IT大手企業の4半期決算を比べてみる (億ドル)

テキトーに外挿したりしてるので、あくまでも規模感をつかむために。売上利益Google5113Amazon411.1eBay214.6Yahoo!185ヤフー5.01.3Mixi0.20.04Apple757.7DELL1607.8IBM24523HP28322SUN32-0.3Microsoft16364Oracle5313Nokia19018NTTドコモ9810Vodafone17534…

twitter-like なシステムにおけるデータベースのスキーマ定義と抽出アルゴリズム

ちゃんとした設計の話を Kazuho@Cybozu Labs: フレンド・タイムライン処理の原理と実践に書きましたので、そちらをご参照ください。飲み会までの時間、ちょっと考えたんだけど、結局、twitter の home のような、「follower 全員のポストから最新 n 件を取得…

並行プログラミングのレイヤ

id:nishidakeisuke さんの一連の話とかぶるんだけど、並行プログラミングのレイヤ化って誰かやってないのかな、と思う。例えば、 低レイヤ: アトミック命令, mutex, ... 中レイヤ: cond, rwlock, ... 高レイヤ: MVCC, 階層ロック, ... みたいな。レイヤ分け…

Q4M における select count(*) の高速化

rev. 183 で行数をキャッシュングするようにしました。

Intel Core Architecture のプリフェッチャ

Streaming Prefetcher (シーケンシャルなアクセスパターンを検出してキャッシュにデータをプリロード) と、一定のオフセット毎のアクセスを検出してプリロードするプリフェッチャの2種類が入っているらしい。http://www.intelcapabilitiesforum.net/article…