LL(Lightweight Language)の実行速度を比較してみた

久し振りにここへ書けるネタが…と思ったら,最後に書いてからもう3年経ってる!?
…というのはさておき.

「LLのPerl, Ruby, Pythonって,同じ処理させたら実行時間にどれくらいの違いが出るんだろう?」
と,気になったので調べてみた.
ついでに,コンパイラ型言語のC, Java, Fortranとも比べる事に.

で,手っ取り早く結果を示すと,処理の早い順は次のようになった.

Fortran < C < Java < Perl < Python < Ruby

やはりコンパイラ型言語の方が早いってのは当然だとして,
LLの中ではPerlが一番早く,次いでPythonRubyの順.

僕にとってこの結果は「ふぅん,そうなんだー」という感じ.
調べた方法やもう少し詳しい結果,各言語のソースプログラムが気になる人は,
このエントリの続きを参照の事!

今回,それぞれの言語でなるべく処理内容が同じくなる様にプログラム書いたんだけど,これが結構面白かったり.
勉強になった事もあり,思い出した事もあり,やっぱりプログラミングって楽しいよね!


LL実行速度の比較【方法】

それぞれの言語について,次の2通りの方法で,円周率πを求める計算を実行した.

今回は単に何らかの処理をさせたいだけなので,求める円周率のケタに興味はない.
なお,(1)は純粋に繰り返し計算を行う事にし,(2)は条件分岐や関数の利用等少し処理を増やす事にした.

また,実行するプラットフォームには,Mac OS XRed Hat Linuxを用いた.
対象の言語は,Perl, Ruby, Python, C, Java, Fortran(Linuxのみ).
それぞれのソースプログラムは,各言語の記述や文法の参考の為に,このエントリに付けておいた.*1

比較に用いたプログラムの実行時間は,プログラムを5回実行してその中央値を採用した..

LL実行速度の比較【結果】

それぞれのプログラムの結果は,次の通り.単位は全て秒.
実行時間でPerlに次ぐPythonは,Perlよりもやや遅い程度だけど,Rubyの遅さはちょっと目立つ.

プログラム1:ライプニッツの公式バージョンの実行時間
pi1 Mac OS X Red Hat Linux
Fortran - 7.535s
C 1.717s 7.587s
Java 2.007s 4.372s
Perl 27.886s 38.332s
Python 36.935s 40.587s
Ruby 70.308s 133.373s

プログラム2:モンテカルロ法バージョンの実行時間
pi2 Mac OS X Red Hat Linux
Fortran - 3.587s
C 2.184s 5.170s
Java 4.642s 13.766s
Perl 61.714s 71.661s
Python 76.739s 111.813s
Ruby 121.372s 234.658s

LL実行速度の比較【ソースプログラムープログラム1:ライプニッツの公式バージョン】

Perl(pi1.pl)
#!/usr/bin/perl

$max = 100000000;
$a = 0.0;

foreach( 0..$max ) {
  $a += (-1.0)**$_ / ( 2.0*$_ + 1.0 );
}

print "pi=". 4.0*$a ."\n";
Ruby(pi1.rb)
#!/usr/bin/ruby

max = 100000000
a = 0.0

for n in 0..max
  a += (-1.0)**n / ( 2.0*n + 1.0 )
end

print( "pi=", 4.0*a, "\n")
Python(pi1.py)
#!/usr/bin/python

max = 100000000
a = 0.0

for n in range( 0, max ):
  a += (-1.0)**n / ( 2.0*n + 1.0 )

print "pi=", 4.0*a
C(pi1.c)
#include<stdio.h>
#include<math.h>

int main(){
  int max = 100000000;
  int i;
  double a = 0.0;

  for( i = 0 ; i <= max ; i++ ){
    a = a + pow( -1.0, i ) / ( 2.0*(double)i + 1.0 );
  }

  printf( "pi=%.15f\n", 4.0*a );

  return 0;
}
Java(pi1.java)
class pi1{
  static public void main( String args[] ){
    int max = 100000000;
    int i;
    double a = 0.0;

    for( i =0 ; i <= max ; i++ ){
      a = a + Math.pow( -1.0, i ) / ( 2.0*(double)i + 1.0 );
    }

    System.out.println( "pi="+ 4.0*a );
  }
}
Fortran(pi1.f90)
program pi1
  implicit none
  integer :: max = 100000000
  integer :: i
  real(8) :: a = 0.0

  do i = 0, max
    a = a + (-1.0)**dble(i) / ( 2.0*dble(i) + 1.0 )
  end do

  print *, "pi=", 4.0*a
end program

LL実行速度の比較【ソースプログラムープログラム2:モンテカルロ法バージョン】

Perl(pi2.pl)
#!/usr/bin/perl

$max = 100000000;
$n = 0;

foreach( 0..$max ) {
  $n++ if ( &p() < 1.0 );
}

print "pi=". 4.0*$n / $max ."\n";

sub p{
  $x = rand();
  $y = rand();
  $r = sqrt( $x**2 + $y**2 );
  return $r;
}
Ruby(pi2.rb)
#!/usr/bin/ruby

def p
  x = rand
  y = rand
  r = Math.sqrt( x**2 + y**2 )
  return r
end

max = 100000000
n = 0

max.times{
  n += 1  if p < 1.0
}

print( "pi=", 4.0*n / max, "\n" )
Python(pi2.py)
#!/usr/bin/python
import math, random

def p():
  x = random.random()
  y = random.random()
  r = math.sqrt( x**2 + y**2 )
  return r

max = 100000000
n = 0

for i in range( 0, max ):
  if p()<1.0:
    n+=1

print "pi=", 4.0*n / max
C(pi2.c)
#include<stdio.h>
#include<math.h>
#include<stdlib.h>

int main(){
  int max = 100000000;
  int n = 0;
  int i;
  double p();

  for( i = 0 ; i <= max ; i++ ){
    if ( p() < 1.0 ) {
      n++;
    }
  }

  printf( "pi=%.15f\n", 4.0 * (double)n / (double)max );

  return 0;
}

double p(){
    double x, y, r;
    x = (double)rand() / (double)RAND_MAX;
    y = (double)rand() / (double)RAND_MAX;
    r = sqrt( pow( x, 2 ) + pow( y, 2 ) );
    return r;
}
Java(pi2.java)
class pi2{
  static public void main( String args[] ){
    int max = 100000000;
    int n = 0;
    int i;

    for( i = 0 ; i <= max ; i++ ){
      if ( p() < 1.0 ) {
        n++;
      }
    }

    System.out.println( "pi="+ 4.0 * (double)n / (double)max );
  }

  static double p(){
    double x, y, r;
    x = Math.random();
    y = Math.random();
    r = Math.sqrt( Math.pow( x, 2 ) + Math.pow( y, 2 ) );
    return r;
  }
}
Fortran(pi2.f90)
program pi2
  implicit none
  integer :: max = 100000000
  integer :: n = 0
  integer :: i
  real :: p

  do i = 0, max
    if ( p() < 1.0 ) then
      n = n + 1
    end if
  end do

  print *, "pi=", 4.0 * dble(n) / dble(max)
end program

function p()
  implicit none
  real :: x, y, p

  call random_number( x )
  call random_number( y )
  p = sqrt( x**2 + y**2 )

end function

*1:これは,僕自身が今後一番参照したりしてw

Windows7リリース候補版でベンチマークを実行してみた

id:hykt:20090116 と id:hykt:20090121 に引き続き。
Windows 7 のリリース候補版が公開されたので、さっそく評価してみた。
評価したPCは、id:hykt:20090116 と同じ。

以前に実行したVistaWindows7ベータ版での結果と比較すると、次のとおり。

Win7RC Win7β Vista
プロセッサ 3.1 3.1 3.9
メモリ(RAM) 4.4 4.4 4.4
グラフィックス 2.1 2.4 2.0
ゲーム用
グラフィックス
3.0 3.0 2.8
プライマリ
ハードディスク
4.2 2 4.2

なお、Win7RCの値は、計測されたスコアそのままの値です。
id:hykt:20090121 で考察した、VistaWindows7{ベータ版,リリース候補版}とでスコアの範囲が異なっている点については、リリース候補版のヘルプに6.0以上の説明が加わってました。

A computer with a base score of 6.0 or 7.0 has a faster hard disk, and can support high-end, graphics-intensive experiences, such as multiplayer and 3D gaming and recording and playback of HDTV content.

どうも値の範囲が1.0〜5.9から1.0〜7.9に単純に広がったのではなく、評価方法はそのままで、Vistaの1.0〜5.9に6.0〜7.9が上乗せされたような感じ。*1

*1:あくまでも推測です。どこかに正式に書かれているかもしれません。

Windows SteadyStateによるディスク保護にハマってみた

Windows SteadyState を使って、ディスク保護をオンにするとき、次のようなメッセージが表示されることがある。

Windows ディスク保護をオンにするには、その前にハードディスク
を最適化する必要があります。ハードディスクを最適化し、再試行し
てください。

「そうなんですか」ということで、ディスクの最適化を実行しようとすると、次のようなメッセージが表示されることがある。

このプログラムは実行されません

このプログラムはグループポリシーによりブロック
されています。詳細については、システム管理者に問
い合わせてください。
「そうなんですか」ということで、システム管理者に問い合わせる…。
それ、僕です。orz
再インストールしてしまえば、ディスク保護をオンにできるのは確認済みなんだけど、今回結構な台数で発生したので、再インストール以外の方法で回避できないか調べてたところ、うまい方法を見つけた。
今、まさにこの問題で困っている人のためのショートカット。 その後、ディスク保護をオンにする。
#でも、これでダメなのもありました…。
やってみたことは次のとおり。

再起動して再度ディスク保護をオンにする

ディスク保護のオンを実行したところ、同じメッセージが出ました。
最適化の実行についても同じメッセージが出ました。

Windows SteadyState をアンインストールして最適化を実行する

最適化の実行で、同じメッセージが出ました。

(最適化の実行はグループポリシーで制限されているので)Group Policy Clientサービスを停止させてみる

サービスの停止ができませんでした。

Windows PEの起動CD(id:hykt:20090204を参照)で起動して最適化を実行する

Windows PEの起動CDの中にはdefragコマンドが含まれていないので、このCDで起動した後、C:\Windows\System32\defrag.exeを実行したところ、「dllがないから実行できない」という内容のエラーが表示されました。

セーフモードで最適化を実行する

Windows起動時に[F8]キーを押してブートオプション画面を表示させ、セーフモードで起動して、defragコマンドを実行してみた。
すると、最適化が実行できた!
最適化の終了後、再起動してディスク保護をオンにしたところ、無事処理された!!
「よっしゃー」ということで、このトラブルが発生していた8台のPCで、早速作業開始。
そして、5台はこれで解決できた。
ただし、残りの3台はやはりディスク保護のオンで再びエラーになった。
諦めきれないので、セーフモードで実行したdefragコマンドに、-wオプションを付けて完全な最適化を実行してみた*1
しかし、結果はダメ。再びエラー。

キャッシュファイルのサイズと連続した空き領域の関係?

Windows SteadyState について説明しているWebページ*2によると…。
キャッシュファイルは空き容量の50%(最大40GB)のサイズで作成されるとのことで、例えば空き容量が30GBの場合15GBのキャッシュファイルが作成される。
ひょっとして、このキャッシュファイルの容量の分だけ、連続した空き領域が必要なんだろうか?
ディスク保護がうまくいかないPCで、セーフモードのdefragコマンドで分析してみたところ、次の結果であり、確かに上の条件を満たしていなかった。
ボリュームサイズ 74.20GB
空き領域 31.47GB
空き領域の最大の範囲 15.47GB
次にディスク保護がうまくいったPCで、同様に分析してみたところ、次の結果であり、上の条件を満たしていた。
ボリュームサイズ 74.20GB
空き領域 21.16GB
空き領域の最大の範囲 19.92GB
それじゃ…ということで、ディスク保護がうまくいかないPCで、不要なファイルやアプリを削除して、再び最適化を実行。
次の状態になった。
ボリュームサイズ 74.20GB
空き領域 30.57GB
空き領域の最大の範囲 19.54GB
これなら条件を満たしているので、ディスク保護がうまくいくかもしれないので試してみたところ、ダメ。
…ということは、この条件以外にも、何かあるんだろうか…。
ここまで調べて Time Up
仕方がないので、これら3台のPCは再インストールすることにした…とほほ。

*1:デフォルトでは、サイズが64MBよりも小さいファイルしか、最適化の対象にならない。

*2:http://www.microsoft.com/japan/windows/products/winfamily/sharedaccess/support/windowsdiskprotection.mspx

Grubのことをいろいろ勉強してみた

ま、結局のところトラブったわけで…。
いろいろ勉強になりました。

お世話になったgrubのコマンド

help
  • ヘルプ。
  • "help コマンド"で各コマンドの詳細が表示される。
grub> help
background RRGGBB                      blocklist FILE
boot                                   border RRGGBB
cat FILE                               chainloader [--force] FILE
clear                                  color NORMAL [HIGHLIGHT]
configfile FILE                        displayapm
displaymem                             find FILENAME
foreground RRGGBB                      geometry DRIVE [CYLINDER HEAD SECTOR [
halt [--no-apm]                        help [--all] [PATTERN ...]
hide PARTITION                         initrd FILE [ARG ...]
kernel [--no-mem-option] [--type=TYPE] makeactive
map TO_DRIVE FROM_DRIVE                md5crypt
module FILE [ARG ...]                  modulenounzip FILE [ARG ...]
pager [FLAG]                           partnew PART TYPE START LEN
parttype PART TYPE                     quietboot
reboot                                 root [DEVICE [HDBIAS]]
rootnoverify [DEVICE [HDBIAS]]         serial [--unit=UNIT] [--port=PORT] [-
setkey [TO_KEY FROM_KEY]               setup [--prefix=DIR] [--stage2=STAGE2_
shade INTEGER                          splashimage FILE
terminal [--dumb] [--no-echo] [--no-ed terminfo [--name=NAME --cursor-address
testvbe MODE                           unhide PARTITION
uppermem KBYTES                        vbeprobe [MODE]
viewport x0 y0 x1 y1                   
geometry (hd0)
  • Print the information for a drive DRIVE.
hide (hd0,1)
  • Hide PARTITION by setting the "hidden" bit in its partition type code.
unhide (hd0,0)
  • Unhide PARTITION by clearing the "hidden" bit in its partition type code.
boot
  • Boot the OS/chain-loader which has been loaded.

Windowsパーティションを起動する場合のコマンド例

grub> unhide (hd0,0)
grub> hide (hd0,1)
grub> rootnoverify (hd0,0)
grub> makeactive
grub> chainloader +1
grub> boot

Linuxパーティションを起動する場合のコマンド例

grub> root (hd0,2)
grub> kernel /boot/vmlinuz-X.X.X-XX ro root=/dev/hda3
grub> initrd /boot/initrd-X.X.XX-XX.img
grub> boot

grubの起動FDの作り方

準備
作成
  • FDを入れる。
  • rawwritewin.exeを起動させる。
  • [Image file]欄にgrub-0.97-i386-pc.ext2fsを指定して[Write]ボタンをクリックする。
起動
  • FDを入れた状態で起動させる。
  • GRUBが起動してプロンプトが表示される。
  • バージョン0.97をダウンロードしたのに、GRUB起動画面では0.96と表示されているのは…なぜ?

"Is my IP address blacklisted?"を使ってみた

こんなサイトがあったんだ。

Check IP Blacklist

Check Your IP Address

Windows Vistaがcrcdisk.sysの読み込みで再びフリーズした

Windows Vistaで再び「起動中にフリーズする」PCに遭遇した。

今、まさにcrcdisk.sysの読み込みでフリーズしている人のためのショートカット。
僕が再び遭遇したトラブルでは、次の方法で解決できました。
「内蔵SATAディスクを一度外して、電源も外して、一晩放置してから、内蔵SATAディスクを元通り接続した。」


#結局原因分からず…。

症状は、id:hykt:20090220 と全く同じ。

それじゃ…と思い、id:hykt:20090220 の対応をとったものの…。
「あれ?ダメじゃん。」

んー。困った。

とりあえず、前回やったこととは別のことをやってみた。

その1、内蔵SATAディスクを別のPCにつなげてみる

作業前。

[PC-A [HDD-A] ] (トラブルPCとそのHDD)
[PC-B [HDD-B] ] (正常なPCと中身が空のHDD)

作業後。

[PC-A [HDD-B] ] (トラブルPCと中身が空のHDD)
[PC-B [HDD-A] ] (正常なPCとトラブルHDD)

すると、

[PC-B [HDD-A] ] (正常なPCとトラブルHDD)
→ 正常に起動

…ということは、このトラブルに内蔵SATAディスクは関係なかったことになる。

それでは、[PC-A [HDD-B] ]にインストールしてみることに。

:(Ghostでインストール中)

インストール終了。
そして起動。
そして再びcrcdisk.sysの読み込みでフリーズ。orz
…ということは、このトラブルはマザーボードかメモリに関係することになる。

その2、フリーズしたまま放っておく

その後、メモリを抜き差ししたり、BIOSをデフォルトに戻してみたりしたが、状況変わらず。
う〜ん、困った…と思いながら、crcdisk.sysの読み込みでフリーズしたまま放っておくと…。
突然起動し始めた。(@_@)なんで?
偶然なのか、それとも放っておけば起動するのか…。
それを調べるために、シャットダウンしてから起動させたところ…フリーズ…放っておくと起動。
どうやら、12分程度放っておくと起動することが分かった。
「フリーズ」という表現は正しくなかったな。でも、これは解決じゃない。(^^;
なんで12分も止まっているのか??? 考えていても分からないので、内蔵SATAディスクのケーブルと電源ケーブルを外したまま、この日の調査は終了…。

その3、電源外して一晩寝かせてみる

そして翌日。
困ったなーと思いながら、内蔵SATAディスクは外したままWindows PEの起動CD(id:hykt:20090204を参照)で起動させると、なんと正常に起動してしまった。(@_@)
一晩寝かせたら治っちゃった?と思いながら、内蔵SATAディスクをつなげてそこから起動させると、なんと正常に起動。(@_@)
昨日の症状がウソのようだ。
それにしても謎が残る。
結局原因はなんだったんだろう。
とりあえず前回同様ブログに書いておきます。