require 'benchmark'
puts RUBY_DESCRIPTION
ben = 500000
Benchmark.bm do |x|
x.report("loop:") { # 空ループ
ben.times do
end
}
x.report("700 :") {
ben.times do
20201016.to_s(2).split("0").max.size
end
}
x.report("710 :") {
ben.times do
n = 20201016
i = 0
while n != 0
n &= n << 1
i += 1
end
end
}
x.report("700a:") {
ben.times do
20201016.to_s(2)
end
}
x.report("700b:") {
ben.times do
"1001101000011111000111000".split("0")
end
}
x.report("700c:") {
ben.times do
["1", "", "11", "1", "", "", "", "11111", "", "", "111"].max
end
}
x.report("700d:") {
ben.times do
"11111".size
end
}
end
=begin
695 デフォルトの名無しさん 2020/10/16(金) 19:48:26.76 ID:2tllxc0n
お題
自然数nを 2進数にした時、 1が連続する個数の最大値を求める。
例
20201016 -> 5
-------
Ruby 実装でのベンチマーク 1 : n = 20161016 固定
>>700,710
どちらもコンソール出力処理は省略
700a-d 700を分解してベンチマーク
700a to_s(2)
700b split("0")
700c max
700d size
※考察
700 と 710 の速度比は 5~6倍程度
700 と 700a がほぼ互角だった
文字処理が高速で数値が遅め(リッチだからしょうが無いが)
n を巨大にした場合を別にしらべる
# C言語でアセンブラ出力を見ると
---
unsigned int n = 20201016;
unsigned int i = 0;
while( n ){
n &= (n << 1);
++ i;
}
printf( "%d\n", i );
---
$ gcc -O2 -S
xorl %r8d, %r8d
movl $20201016, %eax
.L4:
leal (%rax,%rax), %edx
addl $1, %r8d
andl %edx, %eax
jne .L4
=end
cmVxdWlyZSAnYmVuY2htYXJrJwoKCXB1dHMgUlVCWV9ERVNDUklQVElPTgoKYmVuID0gNTAwMDAwCkJlbmNobWFyay5ibSBkbyB8eHwKICB4LnJlcG9ydCgibG9vcDoiKSB7CSMg56m644Or44O844OXCiAgICBiZW4udGltZXMgZG8KICAgIGVuZAogIH0KICB4LnJlcG9ydCgiNzAwIDoiKSB7CiAgICBiZW4udGltZXMgZG8KICAgICAgMjAyMDEwMTYudG9fcygyKS5zcGxpdCgiMCIpLm1heC5zaXplCiAgICBlbmQKICB9CiAgeC5yZXBvcnQoIjcxMCA6IikgewogICAgYmVuLnRpbWVzIGRvCiAgICAgIG4gPSAyMDIwMTAxNgogICAgICBpID0gMAogICAgICB3aGlsZSBuICE9IDAKICAgICAgICBuICY9IG4gPDwgMQogICAgICAgIGkgKz0gMQogICAgICBlbmQKICAgIGVuZAogIH0KICB4LnJlcG9ydCgiNzAwYToiKSB7CiAgICBiZW4udGltZXMgZG8KICAgICAgMjAyMDEwMTYudG9fcygyKQogICAgZW5kCiAgfQogIHgucmVwb3J0KCI3MDBiOiIpIHsKICAgIGJlbi50aW1lcyBkbwogICAgICAiMTAwMTEwMTAwMDAxMTExMTAwMDExMTAwMCIuc3BsaXQoIjAiKQogICAgZW5kCiAgfQogIHgucmVwb3J0KCI3MDBjOiIpIHsKICAgIGJlbi50aW1lcyBkbwogICAgICBbIjEiLCAiIiwgIjExIiwgIjEiLCAiIiwgIiIsICIiLCAiMTExMTEiLCAiIiwgIiIsICIxMTEiXS5tYXgKICAgIGVuZAogIH0KICB4LnJlcG9ydCgiNzAwZDoiKSB7CiAgICBiZW4udGltZXMgZG8KICAgICAgIjExMTExIi5zaXplCiAgICBlbmQKICB9CmVuZAoKPWJlZ2luCgo2OTUg44OH44OV44Kp44Or44OI44Gu5ZCN54Sh44GX44GV44KTIDIwMjAvMTAvMTYo6YeRKSAxOTo0ODoyNi43NiBJRDoydGxseGMwbgogICAg44GK6aGMCiAgICDoh6rnhLbmlbBu44KSIDLpgLLmlbDjgavjgZfjgZ/mmYLjgIEgMeOBjOmAo+e2muOBmeOCi+WAi+aVsOOBruacgOWkp+WApOOCkuaxguOCgeOCi+OAggogICAg5L6LCiAgICAyMDIwMTAxNiAtPiA1Ci0tLS0tLS0KClJ1Ynkg5a6f6KOF44Gn44Gu44OZ44Oz44OB44Oe44O844KvIDEgOiBuID0gMjAxNjEwMTYg5Zu65a6aCj4+NzAwLDcxMArjganjgaHjgonjgoLjgrPjg7Pjgr3jg7zjg6vlh7rlipvlh6bnkIbjga/nnIHnlaUKCjcwMGEtZCA3MDDjgpLliIbop6PjgZfjgabjg5njg7Pjg4Hjg57jg7zjgq8KNzAwYSB0b19zKDIpCjcwMGIgc3BsaXQoIjAiKQo3MDBjIG1heAo3MDBkIHNpemUKCuKAu+iAg+Wvnwo3MDAg44GoIDcxMCDjga7pgJ/luqbmr5Tjga8gNX425YCN56iL5bqmCjcwMCDjgaggNzAwYSDjgYzjgbvjgbzkupLop5LjgaDjgaPjgZ8K5paH5a2X5Yem55CG44GM6auY6YCf44Gn5pWw5YCk44GM6YGF44KBKOODquODg+ODgeOBoOOBi+OCieOBl+OCh+OBhuOBjOeEoeOBhOOBjCkKbiDjgpLlt6jlpKfjgavjgZfjgZ/loLTlkIjjgpLliKXjgavjgZfjgonjgbnjgosKCgojIEPoqIDoqp7jgafjgqLjgrvjg7Pjg5bjg6nlh7rlipvjgpLopovjgovjgagKLS0tCgl1bnNpZ25lZCBpbnQgbiA9IDIwMjAxMDE2OwoJdW5zaWduZWQgaW50IGkgPSAwOwoJd2hpbGUoIG4gKXsKCQluICY9IChuIDw8IDEpOwoJCSsrIGk7Cgl9CglwcmludGYoICIlZFxuIiwgaSApOwotLS0KJCBnY2MgLU8yIC1TCgl4b3JsCSVyOGQsICVyOGQKCW1vdmwJJDIwMjAxMDE2LCAlZWF4Ci5MNDoKCWxlYWwJKCVyYXgsJXJheCksICVlZHgKCWFkZGwJJDEsICVyOGQKCWFuZGwJJWVkeCwgJWVheAoJam5lCS5MNAoKPWVuZAo=