私はいくつかの整数のビットパターンの分析をする必要があるという問題の一つがあるプログラムを作っています。ルビ整数でビットをループする
#Does **NOT** work:
num.each_bit do |i|
#do something with i
end
私が行うことで、働く何かを作ることができました:
num.to_s(2).each_char do |c|
#do something with c as a char
end
これが持っていない私は、このような何かをできるようにしたいと思います。このため
の性能私はしたいと思います。
0.upto(num/2) do |i|
#do something with n[i]
end
これは、このループが実行数百万回、またはそれ以上であることを行っているので、私は希望each_char
方法
よりもさらに悪いパフォーマンスを持っている:あなたがこれを行うことができますことを私が発見した
できるだけ速くなるように。参考のため、ここでの機能の全体
@@aHashMap = Hash.new(-1)
#The method finds the length of the longes continuous chain of ones, minus one
#(101110 = 2, 11 = 1, 101010101 = 0, 10111110 = 4)
def afunc(n)
if @@aHashMap[n] != -1
return @@aHashMap[n]
end
num = 0
tempnum = 0
prev = false
(n.to_s(2)).each_char do |i|
if i
if prev
tempnum += 1
if tempnum > num
num = tempnum
end
else
prev = true
end
else
prev = false
tempnum = 0
end
end
@@aHashMap[n] = num
return num
end
あなたは、おそらくこの場合、 '' @@型変数は非常に珍しい宣言 –
に右の最適化となり、ルックアップテーブルを構築し、パフォーマンスのために行くされている場合。あなたはそれを行う正当な理由がありますか? – tadman
@tadmanいいえ、私はこれには正当な理由がありません。静的な変数を作っていた時に立ち往生したもので、まだリファクタリングをしていません。 – Automatico