けいじゅ@SHLジャパンです.
昔話題になった Sortorを作っていて幾つかバグと変なのを見つけました. あ
と, リクエストが少しあります.
[1] print 10000000000000000000000 - 10000000000000000000001
やってみればわかります. 変な結果が出ます. Bignumの引き算で結果がマイナ
スになる時におかしくなるようです.
[2]
$stdout.sync = TRUE
print a = Float(982273762)
print b = Float(1184838904)
print a/b
--
9.82274e+08 1.62161e-308 Floating exception
bの結果が明らかにおかしいですね. あとちょっと気になるのが, Floating
exceptionは発生するものと考えて良いのかしら??
[3]
B array[bignum]
これは意地悪なのですが, indexにbignumが使えません. いまのrubyの配列の
実装では a[bignum] = foo は, メモリアロケーションの関係で無理だと思い
まのでいいのかな...
ただ, もうちょっとましなエラーを出した方が...
[4] array[RANGE or idx, len] = array(size)
クイックソートの最適化のために, 挿入ソートを作っていておかしい現象を発
見しました.
以下のプログラムを見て下さい:
$stdout.sync = TRUE
def utime
t = Time.new
t.tv_sec * 1000000 + t.tv_usec
end
1000.times do
|time|
size = 2**time
printf "Time: %d Size: %d ", time, size
# a = Array.new(size)
# b = Array.new(size)
a = Array.new
b = Array.new
0.upto(size - 1) do
|i|
a[i] = rand(size)
b[i] = rand(size)
end
t1 = utime
a[0..[a.size - 1, 30].min] = b[0..[a.size - 1, 30].min]
t2 = utime
0.upto([size - 1, 30].min) do
|i|
a[i] = b[i]
end
t3 = utime
printf "%d, %d, %d\n", t2 - t1, t3 - t2, t3 - t2 - (t2 - t1)
end
上記プログラムのメインの処理は以下のように配列のコピー操作を行なうとこ
ろです. 大きな配列の一部分に上書き(サイズ30)を行なっています.
(1)
a[0..[a.size - 1, 30].min] = b[0..[a.size - 1, 30].min]
(2)
0.upto([size - 1, 30].min) do
|i|
a[i] = b[i]
end
(2)の処理は, aのサイズに関係なく一定なのですが, (1)の処理は段々遅くなっ
ていき, size == 32768で処理速度が逆転してしまいます.
たぶん
array1[index, len] = array2
の処理で, array2の長さが lenと同じ場合の処理に特別な対応をとっていない
せいだと思うのですが, もうちょっと工夫していただけないでしょうか?
[5] Array.new(size)
[4]プログラムで コメントになっているところを置き換えて実行してみて下さ
い. 落ちます!!
# そういえば, メッセージが変わりましたね. 良くわかるようになりました.
# (^^;;;
[6] Time
これはリクエストです.
Time.tv_secの様に絶対秒数(を計るメソッドはあるのですが, 絶対マイクロ秒
を計るメソッドが用意してありません. ベンチマークとかする時には良く使う
ので, 用意してもらえませんか?
あと, Timeには, tm構造体から月(tm_mon)を取り出すメソッドがないのですが...
なんか理由があるのですか?
最後に, 時間の加減算をサポートして下さい.
__
.........................................石塚 圭樹@SHLジャパン(株)...
------------>アドレス変わりました!! e-mail: keiju / shljapan.co.jp <----