2009-05-01から1ヶ月間の記事一覧

MISRA CとかC99とか、あるいはブールシット

MISRA CとかC99といった、C言語の標準化とか、こう書け的なスタイルの話で、非常に多くの議論の蓄積があることを発見しつつある。例えばマクロよりinline関数使えよという議論がある。関数なら型チェックができるとか、返り値が渡せることとか、関数に渡す値…

アセンブラ

ビットが並ぶような話だとか低レベルなことを調べ始めたら、ちょっと懐かしくてうれしくなった。一方で、ぼくの頭の中ではやっぱり数値はすべて8ビット。charのポインタでループして何が悪いかに気づいていなかった。今は最低でも4バイト単位で処理するのが…

whileループの文字数カウントはどのぐらい遅いか

文字列の長さを調べるのに、charをwhileループで回すか、4バイト単位でスキャンするか(strlen.c)、あるいは386依存の命令を使うか(strlen(3)=推定strlen.s)でどのぐらい速度が違うのか計ってみた。 #include <stdio.h> #include <stdlib.h> #include <string.h> int main(void) { int</string.h></stdlib.h></stdio.h>…

シュワルツ変換とRuby

ソートのときに比較関数が何らかの計算を含む場合、計算に重複が出て処理性能が落ちる。これを避けるために、あらかじめ計算結果と一緒に連想配列のような入れ物を別途用意して並べ直すのが一般的なようだ。1994年にPerlハッカーのランダル・シュワルツがPer…

strlen.cは4バイトもしくは8バイト単位で文字列の長さを数える

標準ライブラリのstrlen(3)とか言っても、whileループより速いものって作れるんだろうかと思って、以下のファイルを眺めてみた。 glibc$ find ./ -iname strlen* ./sysdeps/sh/strlen.S ./sysdeps/i386/i486/strlen.S ./sysdeps/i386/i586/strlen.S ./sysdep…

文字列の並べ替え

標準ライブラリのqsortの使い方が少し分かったので、文字列の並べ替えもやってみた。 #include <stdio.h> #include <stdlib.h> #include <time.h> #define NUM 10 char str[NUM][16]; void show(void) { int i; for (i = 0; i < NUM; i++) { printf("%s\n",str[i]); } } int cmp (const </time.h></stdlib.h></stdio.h>…

バブルソートの遅さを体感してみる

バブルソートには思い出がある。大学生のときにPC-9801で落ちゲーを作った。上から落ちてくるトランプのカードを5×5のマトリックスに積み上げて、縦横斜めでポーカーの役を作る。やりこむと「縦列で数字を揃えようとしても最後で失敗する確率が高くてスコア…

連結リストのソート

C入門、プログラミング入門として、連結リストの次に基本的なソートをやってみようと少し格闘してみた。単純なint配列とかじゃテキストのままなので、どうせだったら連結リストを並べ変えてみようと思ったのが間違いだった。まず、いちばん簡単なのは隣り合…

内部DSL

RubyはDSL(Domain Specific Language)を定義するプログラミング言語として期待されているという。この方面の権威らしいMartin Fowlerによれば、DSLには長い歴史がある。SQLとかCSSとかMakefileとか、ともかく何らかの目的に特化した記述言語をDSLと呼ぶ。…