開発環境
- OS X Lion - Apple(OS)
- BBEdit - Bare Bones Software, Inc.(Text Editor)
- Script言語:Ruby
『初めてのプログラミング 第2版』(Chris Pine 著、長尾 高弘 訳、オライリー・ジャパン、2010年、ISBN978-4-87311-469-9)の 14章(ブロックとproc), 14.4(練習問題)よりよいプロファイリング を解いてみる。
その他参考書籍
- 『プログラミング言語 Ruby』David Flanagan, まつもと ゆきひろ 著 、卜部 昌平 監訳、長尾 高弘 訳、オライリー・ジャパン、2009年、ISBN978-4-87311-394-4)
- Rubyクックブック ―エキスパートのための応用レシピ集
よりよいプロファイリング
コード(BBEdit)
sample.rb
#!/usr/bin/env ruby1.9 #-*- coding: utf-8 -*- def profile block_description, &block s = true if s start_time = Time.new block.call duration = Time.new - start_time puts "#{block_description}: #{duration}秒" else block.call end end profile '25000回の倍化' do number = 1 25000.times do number = number + number end puts "#{number.to_s.length}桁" end profile '百万までのカウント' do number = 0 1000000.times do number = number + 1 end end
入出力結果(Terminal)
$ ./sample.rb # オンの場合 7526桁 25000回の倍化: 0.08954秒 百万までのカウント: 0.327856秒 $ ./sample.rb # オフの場合 7526桁 $
ちなみにJavaScriptの場合。
コード(BBEdit)
var n1 = parseInt($('#t0').val()); var n2 = parseInt($('#t1').val()); var s = $('option:selected', $('#s0')).val() === "on" ? true : false; function profile(description, func){ if(s){ var start = new Date(); func(); var duration = ((new Date()) - start) / 1000; $('#pre0').append(description + ": " + duration + "秒\n"); } else { func(); } } profile(n1 + "回の倍化", function(){ var n = 1; for(var i = 0; i < n1; i++){ n = n + n; } var l; if(n === Infinity){ l = "(測定不能)"; } else { l = new String(n).length; } $('#pre0').append(l + "桁\n"); }); profile(n2 + "までのカウント", function(){ var n = 0; for(var i = 0; i < n2; i++){ n = n + 1; } });
pythonの場合。
sample.py
コード(BBEdit)
#!/usr/bin/env python3.3 # -*- coding: utf-8 -*- def profile(description, func): s = True if s: import time start = time.time() func() duration = time.time() - start print("{0}: {1}秒".format(description, duration)) else: func() def f(): number = 1 for x in range(25000): number = number + number print("{0}桁".format(len(str(number)))) profile("25000回の倍化", f) def g(): number = 0 for x in range(1000000): number = number + 1 profile("百万までのカウント", g)
入出力結果(Terminal)
$ ./sample.py 7526桁 25000回の倍化: 0.0637199878692627秒 百万までのカウント: 0.7920880317687988秒 $ ./sample.py 7526桁 $
perlの場合。
sample.pl
コード(BBEdit)
#!/usr/bin/env perl use strict; use warnings; use utf8; use 5.016; binmode STDIN, ":utf8"; binmode STDOUT, ":utf8"; use Time::HiRes qw(gettimeofday); # 桁数がinf(無限大、だから3桁と表示)になったから使ってみたけど、今度は計測できなくなった # use bigint; sub profile{ my($description, $f) = @_; my $s = 1; if($s){ my $start = gettimeofday(); &$f; my $duration = gettimeofday() - $start; print $description . ": " . $duration . "秒\n"; } else { &$f; } } profile("25000回の倍化", sub{ my $number = 1; for(1..25000){ $number = $number + $number; } print length($number) . "桁\n"; }); profile("百万までのカウント", sub{ my $number = 0; for(1..1000000){ $number = $number + 1; } });
入出力結果(Terminal)
$ ./sample.pl (測定不能)桁 25000回の倍化: 0.00393795967102051秒 百万までのカウント: 0.776429176330566秒 $ ./sample.pl (測定不能)桁 $
0 コメント:
コメントを投稿