Sunday, March 26, 2006

malloc, realloc の効率的な使い方

malloc() でメモリを確保する場合、2^n 単位で確保するとよい。
無駄になるメモリはたかだか50%だし、変な断片化も最小化される。

とのことだ。断片化については数学的な議論をして確認したいところだ。

また、realloc() についても、以前に割り当てられていたサイズの2倍のサイズを要求すると、log(n) 回より多く realloc() を呼ぶこともないし、巨大な文字列に大しても適度なパフォーマンスが得られるし、無駄になるメモリもたかだか50%で済む。

とのことだ。これも数学的に確認したいところだ。

以上は、『Joel on Software』の第2章で触れられていたことだ。

Tuesday, March 14, 2006

java.sql.Array を使う方法

これはインターフェースなので、java.sql.Connection 同様、JDBC ドライバのベンダから実装を提供してもらわねばならない。

Oracle では、oracle.sql.ARRAY がこのインターフェースの実装になっている。次のようなコードを使う。

oracle.sql.ArrayDescriptor arrayDesc = oracle.sql.ArrayDescriptor.createDescriptor("HOGE_ARRAY", con);
java.sql.Array array = new oracle.sql.ARRAY(arrayDesc, con, new int[] {1,3,5,0});

con は java.sql.Connection である。これは、Oracle のドライバから取得した Connection でなくてはならない。DataSource 等から取得したラッパだと ClassCastException が発生することがある。

HOGE_ARRAY は、Oracle の CREATE TYPE 文でつくった型だ。何故か大文字で指定しなくてはならなかった。

ここでは、整数配列から java.sql.Array をつくっているが、当然、HOGE_ARRAY 型は整数を格納できる配列型として Oracle 側で定義していなくてはならない。