LL(Lightweight Language)の実行速度を比較してみた
久し振りにここへ書けるネタが…と思ったら,最後に書いてからもう3年経ってる!?
…というのはさておき.
「LLのPerl, Ruby, Pythonって,同じ処理させたら実行時間にどれくらいの違いが出るんだろう?」
と,気になったので調べてみた.
ついでに,コンパイラ型言語のC, Java, Fortranとも比べる事に.
で,手っ取り早く結果を示すと,処理の早い順は次のようになった.
やはりコンパイラ型言語の方が早いってのは当然だとして,
LLの中ではPerlが一番早く,次いでPython,Rubyの順.
僕にとってこの結果は「ふぅん,そうなんだー」という感じ.
調べた方法やもう少し詳しい結果,各言語のソースプログラムが気になる人は,
このエントリの続きを参照の事!
今回,それぞれの言語でなるべく処理内容が同じくなる様にプログラム書いたんだけど,これが結構面白かったり.
勉強になった事もあり,思い出した事もあり,やっぱりプログラミングって楽しいよね!
LL実行速度の比較【方法】
それぞれの言語について,次の2通りの方法で,円周率πを求める計算を実行した.
今回は単に何らかの処理をさせたいだけなので,求める円周率のケタに興味はない.
なお,(1)は純粋に繰り返し計算を行う事にし,(2)は条件分岐や関数の利用等少し処理を増やす事にした.
また,実行するプラットフォームには,Mac OS XとRed Hat Linuxを用いた.
対象の言語は,Perl, Ruby, Python, C, Java, Fortran(Linuxのみ).
それぞれのソースプログラムは,各言語の記述や文法の参考の為に,このエントリに付けておいた.*1
比較に用いたプログラムの実行時間は,プログラムを5回実行してその中央値を採用した..
LL実行速度の比較【結果】
それぞれのプログラムの結果は,次の通り.単位は全て秒.
実行時間でPerlに次ぐPythonは,Perlよりもやや遅い程度だけど,Rubyの遅さはちょっと目立つ.
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 と同じ。
以前に実行したVistaとWindows7ベータ版での結果と比較すると、次のとおり。
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 で考察した、VistaとWindows7{ベータ版,リリース候補版}とでスコアの範囲が異なっている点については、リリース候補版のヘルプに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:あくまでも推測です。どこかに正式に書かれているかもしれません。
Mac OS X Leopardの画面共有がどこにあるか探してみた
Macintosh HD:システム:ライブラリ:CoreServices:画面共有.app
にあった。
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がないから実行できない」という内容のエラーが表示されました。セーフモードで最適化を実行する
すると、最適化が実行できた!
最適化の終了後、再起動してディスク保護をオンにしたところ、無事処理された!!
そして、5台はこれで解決できた。
諦めきれないので、セーフモードで実行したdefragコマンドに、-wオプションを付けて完全な最適化を実行してみた*1。
しかし、結果はダメ。再びエラー。
キャッシュファイルのサイズと連続した空き領域の関係?
キャッシュファイルは空き容量の50%(最大40GB)のサイズで作成されるとのことで、例えば空き容量が30GBの場合15GBのキャッシュファイルが作成される。
ひょっとして、このキャッシュファイルの容量の分だけ、連続した空き領域が必要なんだろうか?
ディスク保護がうまくいかないPCで、セーフモードのdefragコマンドで分析してみたところ、次の結果であり、確かに上の条件を満たしていなかった。
ボリュームサイズ | 74.20GB |
空き領域 | 31.47GB |
空き領域の最大の範囲 | 15.47GB |
ボリュームサイズ | 74.20GB |
空き領域 | 21.16GB |
空き領域の最大の範囲 | 19.92GB |
次の状態になった。
ボリュームサイズ | 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
"Is my IP address blacklisted?"を使ってみた
こんなサイトがあったんだ。
Check IP Blacklist
- http://whatismyipaddress.com/
- Check 100+ DNS based block lists to see if your IP is blocked.
Check Your IP Address
- http://www.ipchecking.com
- IP Lookup, Geographic IP Location and Spam Block List Checker
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ディスクは関係なかったことになる。
:
:(Ghostでインストール中)
:
インストール終了。
そして起動。
そして再びcrcdisk.sysの読み込みでフリーズ。orz
その2、フリーズしたまま放っておく
う〜ん、困った…と思いながら、crcdisk.sysの読み込みでフリーズしたまま放っておくと…。
突然起動し始めた。(@_@)なんで?