2013年1月2日水曜日

開発環境

『初めてのプログラミング 第2版』(Chris Pine 著、長尾 高弘 訳、オライリー・ジャパン、2010年、ISBN978-4-87311-469-9)の 14章(ブロックとproc), 14.4(練習問題)よりよいプロファイリング を解いてみる。

その他参考書籍

よりよいプロファイリング

コード(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 コメント:

コメントを投稿