Skip to content

Instantly share code, notes, and snippets.

@christineponyl
Created April 12, 2018 15:34
Show Gist options
  • Save christineponyl/52c8fb37b5595c1343e09045ab02761e to your computer and use it in GitHub Desktop.
Save christineponyl/52c8fb37b5595c1343e09045ab02761e to your computer and use it in GitHub Desktop.
use "ponybench"
use "random"
use "collections"
actor Main is BenchmarkList
new create(env: Env) =>
let bench = PonyBench(env, this)
fun tag benchmarks(bench: PonyBench) =>
let rand = Rand
let random_numbers: Array[I64] val =
recover
let tmp = Array[I64](100_000)
for _ in Range(0, 100_000) do
tmp.push(rand.next().i64())
end
tmp
end
bench(LLVMMulcBench(random_numbers))
bench(ManualMulcBench(random_numbers))
class iso LLVMMulcBench is MicroBenchmark
let random_numbers: Array[I64] val
new iso create(ran: Array[I64] val) =>
random_numbers = ran
fun name(): String => "mulc.i64.llvm"
fun apply() =>
var i: I64 = I64(1)
for num in random_numbers.values() do
(i, _) = i.mulc(num)
end
class iso ManualMulcBench is MicroBenchmark
let random_numbers: Array[I64] val
new iso create(ran: Array[I64] val) =>
random_numbers = ran
fun name(): String => "mulc.i64.manual"
fun apply() =>
var i: I64 = I64(1)
for num in random_numbers.values() do
(i, _) = my_mulc(i, num)
end
fun my_mulc(i1: I64, i2: I64): (I64, Bool) =>
var overflow = false
let result = i1 * i2
if i1 == I64.min_value() then
return (result, (i2 != 0) and (i2 != 1))
end
if i2 == I64.min_value() then
return (result, (i1 != 0) and (i1 != 1))
end
let i1_neg = i1 >> (i1.bitwidth() - 1)
let i1_abs = (i1 xor i1_neg) - i1_neg
let i2_neg = i2 >> (i2.bitwidth() - 1)
let i2_abs = (i2 xor i2_neg) - i2_neg
if ((i1_abs < 2) or (i2_abs < 2)) then
return (result, false)
end
if (i1_neg == i2_neg) then
(result, (i1_abs > (I64.max_value() / i2_abs)))
else
(result, (i1_abs > (I64.min_value() / -i2_abs)))
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment