#!/usr/bin/perl
use strict;
use warnings;
use Benchmark ':all';
use Encode;
use Encode::Guess qw(euc-jp shiftjis 7bit-jis);
use Text::Iconv;
use Unicode::Japanese;
use Jcode;
require 'jcode.pl';
my $text = qq{ASCII, 漢字、カタカナ、ひらがなの混じったtext};

cmpthese(
  timethese(50000, {
    'jcode::convert(guess-sjis-grob-cache)' => sub {
      jcode::cache();
      jcode::convert(*text, 'sjis');
      jcode::convert(*text, 'euc');
    },
    'jcode::convert(fixed-sjis-grob-cache)' => sub {
      jcode::cache();
      jcode::convert(*text, 'sjis', 'euc');
      jcode::convert(*text, 'euc', 'sjis');
    },
    'jcode::convert(guess-sjis-ref-cache)' => sub {
      jcode::cache();
      jcode::convert(\$text, 'sjis');
      jcode::convert(\$text, 'euc');
    },
    'jcode::convert(fixed-sjis-ref-cache)' => sub {
      jcode::cache();
      jcode::convert(\$text, 'sjis', 'euc');
      jcode::convert(\$text, 'euc', 'sjis');
    },
    'jcode::convert(guess-sjis-grob-nocache)' => sub {
      jcode::nocache();
      jcode::convert(*text, 'sjis');
      jcode::convert(*text, 'euc');
    },
    'jcode::convert(fixed-sjis-grob-nocache)' => sub {
      jcode::nocache();
      jcode::convert(*text, 'sjis', 'euc');
      jcode::convert(*text, 'euc', 'sjis');
    },
    'jcode::convert(guess-sjis-ref-nocache)' => sub {
      jcode::nocache();
      jcode::convert(\$text, 'sjis');
      jcode::convert(\$text, 'euc');
    },
    'jcode::convert(fixed-sjis-ref-nocache)' => sub {
      jcode::nocache();
      jcode::convert(\$text, 'sjis', 'euc');
      jcode::convert(\$text, 'euc', 'sjis');
    },
    'Jcode::new(guess-sjis)' => sub {
      $text = Jcode->new($text)->sjis;
      $text = Jcode->new($text)->euc;
    },
    'Jcode::convert(guess-sjis)' => sub {
      Jcode::convert(\$text, 'sjis');
      Jcode::convert(\$text, 'euc');
    },
    'Jcode::convert(fixed-sjis)' => sub {
      Jcode::convert(\$text, 'sjis', 'euc');
      Jcode::convert(\$text, 'euc', 'sjis');
    },
    'Unicode::Japanese::new(guess-sjis)' => sub {
      $text = Unicode::Japanese->new($text, 'auto')->sjis;
      $text = Unicode::Japanese->new($text, 'auto')->euc;
    },
    'Unicode::Japanese::new(fixed-sjis)' => sub {
      $text = Unicode::Japanese->new($text, 'euc')->sjis;
      $text = Unicode::Japanese->new($text, 'sjis')->euc;
    },
    'Encode::from_to(guess-sjis)' => sub {
      Encode::from_to($text, 'Guess', 'shiftjis');
      Encode::from_to($text, 'Guess', 'euc-jp');
    },
    'Encode::from_to(fixed-sjis)' => sub {
      Encode::from_to($text, 'euc-jp', 'shiftjis');
      Encode::from_to($text, 'shiftjis', 'euc-jp');
    },
    'Text::Iconv(fixed-sjis)' => sub {
      $text = Text::Iconv->new('euc-jp', 'shift_jis')->convert($text);
      $text = Text::Iconv->new('shift_jis', 'euc-jp')->convert($text);
    },
    'Jcode::new(guess-utf8)' => sub {
      $text = Jcode->new($text)->utf8;
      $text = Jcode->new($text)->euc;
    },
    'Jcode::convert(guess-utf8)' => sub {
      Jcode::convert(\$text, 'utf8');
      Jcode::convert(\$text, 'euc');
    },
    'Jcode::convert(fixed-utf8)' => sub {
      Jcode::convert(\$text, 'utf8', 'euc');
      Jcode::convert(\$text, 'euc', 'utf8');
    },
    'Unicode::Japanese::new(guess-utf8)' => sub {
      $text = Unicode::Japanese->new($text, 'auto')->utf8;
      $text = Unicode::Japanese->new($text, 'auto')->euc;
    },
    'Unicode::Japanese::new(fixed-utf8)' => sub {
      $text = Unicode::Japanese->new($text, 'euc')->utf8;
      $text = Unicode::Japanese->new($text, 'utf8')->euc;
    },
    'Encode::from_to(guess-utf8)' => sub {
      Encode::from_to($text, 'Guess', 'utf8');
      Encode::from_to($text, 'Guess', 'euc-jp');
    },
    'Encode::from_to(fixed-utf8)' => sub {
      Encode::from_to($text, 'euc-jp', 'utf8');
      Encode::from_to($text, 'utf8', 'euc-jp');
    },
    'Text::Iconv(fixed-utf8)' => sub {
      $text = Text::Iconv->new('euc-jp', 'utf8')->convert($text);
      $text = Text::Iconv->new('utf8', 'euc-jp')->convert($text);
    },
  })
);

