Skip to content

Instantly share code, notes, and snippets.

@na-o-ys
Last active October 5, 2016 01:04
Show Gist options
  • Select an option

  • Save na-o-ys/44a6f3bd6f1ed9ebd27835581f6289b7 to your computer and use it in GitHub Desktop.

Select an option

Save na-o-ys/44a6f3bd6f1ed9ebd27835581f6289b7 to your computer and use it in GitHub Desktop.
だんだん速くなるfizzbuzz
max = ARGV[0].to_i
1.upto(max) do |i|
if i % 15 == 0
puts "FizzBuzz"
elsif i % 3 == 0
puts "Fizz"
elsif i % 5 == 0
puts "Buzz"
else
puts i
end
end
max = ARGV[0].to_i
arr = 1.upto(max).to_a.map { |i|
if i % 15 == 0
"FizzBuzz"
elsif i % 3 == 0
"Fizz"
elsif i % 5 == 0
"Buzz"
else
i
end
}
puts arr.join("\n")
max = ARGV[0].to_i
arr = 1.upto(max).to_a
2.step(max - 1, 3) { |i| arr[i] = "Fizz" }
4.step(max - 1, 5) { |i| arr[i] = "Buzz" }
14.step(max - 1, 15) { |i| arr[i] = "FizzBuzz" }
puts arr.join("\n")
# frozen_string_literal: true
max = ARGV[0].to_i
arr = 1.upto(max).to_a
2.step(max - 1, 3) { |i| arr[i] = "Fizz" }
4.step(max - 1, 5) { |i| arr[i] = "Buzz" }
14.step(max - 1, 15) { |i| arr[i] = "FizzBuzz" }
puts arr.join("\n")
@iseq = ["YARVInstructionSequence/SimpleDataFormat",
2,
3,
1,
{:arg_size=>0, :local_size=>4, :stack_max=>3},
"<main>",
"fizzbuzz",
"fizzbuzz",
1,
:top,
[:i, :max, :arr],
{},
[],
[:max,
[:getglobal, :$*],
[:putobject_OP_INT2FIX_O_0_C_],
[:opt_aref, {}, false],
[:opt_send_without_block, {:mid=>:to_i, :orig_argc=>0}, false],
[:setlocal_OP__WC__0, 3],
:initialize_array,
[:putobject_OP_INT2FIX_O_1_C_],
[:getlocal_OP__WC__0, 3],
[:opt_send_without_block, {:mid=>:upto, :orig_argc=>1}, false],
[:opt_send_without_block, {:mid=>:to_a, :orig_argc=>0}, false],
[:setlocal_OP__WC__0, 2],
:main,
# Fizz
# i = 2
[:putobject, 2],
[:setlocal_OP__WC__0, 4],
:fizz_loop_start,
# if i < max
[:getlocal_OP__WC__0, 4],
[:getlocal_OP__WC__0, 3],
[:opt_lt, {}, false],
[:branchunless, :fizz_loop_end],
[:pop],
# arr[i] = "Fizz"
[:putnil],
[:getlocal_OP__WC__0, 2], # arr
[:getlocal_OP__WC__0, 4], # i
[:putobject, "Fizz"],
[:setn, 3],
[:opt_aset, {}, false],
[:pop],
# i += 3
[:getlocal_OP__WC__0, 4],
[:putobject, 3],
[:opt_plus, {}, false],
[:setlocal_OP__WC__0, 4],
[:jump, :fizz_loop_start],
:fizz_loop_end,
# Buzz
# i = 4
[:putobject, 4],
[:setlocal_OP__WC__0, 4],
:buzz_loop_start,
# if i < max
[:getlocal_OP__WC__0, 4],
[:getlocal_OP__WC__0, 3],
[:opt_lt, {}, false],
[:branchunless, :buzz_loop_end],
[:pop],
# arr[i] = "Buzz"
[:putnil],
[:getlocal_OP__WC__0, 2], # arr
[:getlocal_OP__WC__0, 4], # i
[:putobject, "Buzz"],
[:setn, 3],
[:opt_aset, {}, false],
[:pop],
# i += 5
[:getlocal_OP__WC__0, 4],
[:putobject, 5],
[:opt_plus, {}, false],
[:setlocal_OP__WC__0, 4],
[:jump, :buzz_loop_start],
:buzz_loop_end,
# FizzBuzz
# i = 14
[:putobject, 14],
[:setlocal_OP__WC__0, 4],
:fizzbuzz_loop_start,
# if i < max
[:getlocal_OP__WC__0, 4],
[:getlocal_OP__WC__0, 3],
[:opt_lt, {}, false],
[:branchunless, :fizzbuzz_loop_end],
[:pop],
# arr[i] = "FizzBuzz"
[:putnil],
[:getlocal_OP__WC__0, 2], # arr
[:getlocal_OP__WC__0, 4], # i
[:putobject, "FizzBuzz"],
[:setn, 3],
[:opt_aset, {}, false],
[:pop],
# i += 15
[:getlocal_OP__WC__0, 4],
[:putobject, 15],
[:opt_plus, {}, false],
[:setlocal_OP__WC__0, 4],
[:jump, :fizzbuzz_loop_start],
:fizzbuzz_loop_end,
:output,
[:putself],
[:getlocal_OP__WC__0, 2],
[:putobject, "\n"],
[:opt_send_without_block, {:mid=>:join, :orig_argc=>1}, false],
[:opt_send_without_block, {:mid=>:puts, :flag=>20, :orig_argc=>1}, false],
[:leave]]]
require 'fiddle'
class RubyVM::InstructionSequence
load_fn_addr = Fiddle::Handle::DEFAULT['rb_iseq_load']
load_fn = Fiddle::Function.new(load_fn_addr,
[Fiddle::TYPE_VOIDP] * 3,
Fiddle::TYPE_VOIDP)
define_singleton_method(:load) do |data, parent = nil, opt = nil|
load_fn.call(Fiddle.dlwrap(data), parent, opt).to_value
end
end
RubyVM::InstructionSequence.load(@iseq).eval
@na-o-ys
Copy link
Author

na-o-ys commented Aug 3, 2016

a_1: 素
a_2: puts を削減
a_3: 演算(除算, 比較演算)を削減
a_4: String 生成を削減
a_4_opt_iseq: ISeqに書き下す

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment