Skip to content

Instantly share code, notes, and snippets.

@RespiteSage
Created December 23, 2021 00:43
Show Gist options
  • Save RespiteSage/95b0182a9fa6d9961766faa6ef8faf4a to your computer and use it in GitHub Desktop.
Save RespiteSage/95b0182a9fa6d9961766faa6ef8faf4a to your computer and use it in GitHub Desktop.
Crystal BitArray methods with benchmarks of different #fill implementations
require "benchmark"
require "bit_array"
require "intrinsics"
struct BitArray
def self.new(size, & : Int32 -> Bool)
instance = BitArray.new(size)
(0...size).each do |i|
instance[i] = yield i
end
instance
end
def fill_override(value : Bool) : self
@bits.to_slice(malloc_size).fill (value ? ~0u32 : 0u32)
self
end
def fill_override_intrinsics(value : Bool) : self
Intrinsics.memset(@bits, (value ? ~0u8 : 0u8), bytesize, false)
self
end
def fill_override_intrinsics_bitwise(value : Bool) : self
Intrinsics.memset(@bits, (value.to_unsafe << 8), bytesize, false)
self
end
end
RANDOM = Random.new
ba = BitArray.new(12) { |i| RANDOM.next_bool }
pp ba
puts ""
guide = BitArray.new(1_000) { |i| RANDOM.next_bool }
start = BitArray.new(1_000) { |i| RANDOM.next_bool }
Benchmark.ips do |x|
{% for method in ["fill", "fill_override", "fill_override_intrinsics", "fill_override_intrinsics_bitwise"] %}
test = start.dup
x.report({{method}}) do
guide.each { |value| test.{{method.id}} value }
end
x.report("{{method.id}}_only_true") do
guide.size.times { test.{{method.id}} true }
end
x.report("{{method.id}}_only_false") do
guide.size.times { test.{{method.id}} false }
end
{% end %}
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment