[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[dennou-ruby:000716] Re: NumArray



堀之内です。

> 以前, FIP の谷口さんから紹介のあった神代さんですが, ruby に慣れてもら
> うことも含めて, まずは以下のような内容の作業を依頼しました. 
> 
> 1. 川那辺君が作った NumArray を使ってみる. 
> 
> 2. NumArray と同様なパッケージで, ruby コミュニティでは古株の NArray
>    も平行して使ってみる. 
> 
> 3. パフォーマンスにも気を配りながらそれぞれの使い勝手を報告してもらう.
> 
> 質問等が上がってくることもあるかと思いますが, みなさんよろしくお願いし
> ます. 

ベンチマークには、ruby のホームページの「アーカイブ」にある
benchmark というパッケージが便利です。インストールは
/usr/local/lib/ruby/site_ruby/1.6/
等の、パスの通ったディレクトリーにコピーするだけです。

簡単なベンチマーク結果をお送りします。NArray vs NumArray vs
Fortran90 (compiler: Fujitsu) vs C (compiler: gcc) です。
ソース一式は添付。結果は以下です。"shisoku" の部分は Fortran90,
C とも比較できます。

  % cd benchmark/
  % ./Bench
  #### NArray vs NumArray ####
  shisoku
    0.390000   0.130000   0.520000 (  0.522238)  <-- 1行目はNArray
    0.540000   0.070000   0.610000 (  0.608763)  <-- 2行目はNumArray(以下同様)
  shisoku (with scalar)
    0.400000   0.000000   0.400000 (  0.396140)
    0.530000   0.000000   0.530000 (  0.523714)
  shisoku (with scalar, coerced)
    0.400000   0.000000   0.400000 (  0.410367)
    0.530000   0.000000   0.530000 (  0.536637)
  math
    2.690000   0.000000   2.690000 (  2.743106)
    2.700000   0.000000   2.700000 (  2.840096)
  sum, av, var, rms
    0.120000   0.000000   0.120000 (  0.119765)
    0.130000   0.000000   0.130000 (  0.124949)
  max, min, median
    0.000000   0.000000   0.000000 (  0.000047)
    0.000000   0.000000   0.000000 (  0.000047)
  transpose
    0.370000   0.000000   0.370000 (  0.367455)
    1.860000   0.000000   1.860000 (  1.858422)

  #### shisoku in Fortran90 (10 iterations of +-*/) ####

  real        1.2         <--   10回繰り返してるので、上と比較する
  user        1.0         <--   ためには10分の1にする
  sys         0.0
  #### shisoku in C (10 iterations of +-*/) ####

  real        1.8         <--   10回繰り返してるので、上と比較する
  user        1.7         <--   ためには10分の1にする
  sys         0.1

比較には 100*100*100 の3次元配列を使いました。(Cだけ面倒だった
ので 1000,000 の1次元配列。)
四則演算では NumArray は NArray より数割遅いです。
新しい NArray/NumArray オブジェクトを作る必要がない "sum, av,
var, rms" の 部分ではほとんど差がつかないので、この差は新オブジェ
クトを allocate する時間の違いではないかと予想できます。

ruby のためのオーバヘッドを省くよう C で計算すると、四則演算に関
し、NArray でもも C の倍くらい時間がかかっていることがわかります。

以上、配列の大きさがかわると結果が違うでしょうし、それはシステマ
ティックに調べるべきですが、やってません。また、部分配列の切り出
しや代入等、いろいろなメソッドについても調べてみたいところです。
また、他のプラットフォームでのテストも欲しいです。神代さんに、期
待します。

堀之内 武                    horinout@xxxxxx
京都大学宙空電波科学研究センター        phone:0774-38-3812  
611-0011 宇治市五ヶ庄                     fax:0774-31-8463