Created
September 8, 2012 10:58
-
-
Save Deco/3673493 to your computer and use it in GitHub Desktop.
Benchmark of C callbacks in LuaJIT 2.0.0-beta10
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
local ffi = require"ffi" | |
jit.on() | |
ffi.cdef[[ | |
typedef int (*getval_func)(); | |
/* imagine these are C functions */ | |
typedef void (*sum_push_func)(int* total, getval_func getval); | |
typedef void (*sum_pull_func)(int* total, int val); | |
]] | |
local sum_push = ffi.cast("sum_push_func", function(total_ptr, getval_ptr) | |
total_ptr[0] = total_ptr[0]+getval_ptr() | |
end) | |
local sum_pull = ffi.cast("sum_pull_func", function(total_ptr, val) | |
total_ptr[0] = total_ptr[0]+val | |
end) | |
local getval = function() | |
return 6 | |
end | |
local getval_ptr = ffi.cast("getval_func", getval) | |
function test_push(n) | |
local total_ptr = ffi.new("int[1]", 0) | |
for i = 1, n do | |
sum_push(total_ptr, getval_ptr) | |
end | |
return total_ptr[0] | |
end | |
function test_pull(n) | |
local total_ptr = ffi.new("int[1]", 0) | |
for i = 1, n do | |
sum_pull(total_ptr, getval()) | |
end | |
return total_ptr[0] | |
end | |
local gettime = os.clock | |
local fmt = "%-10s %-16s %-16s %-16s %-16s" | |
local jit_options = {jit.status()} local jit_on = table.remove(jit_options, 1) | |
print(jit.version.. " ("..jit.os.." "..jit.arch..")") | |
print("JIT: "..(jit_on and "ON" or "OFF").." "..table.concat(jit_options, " ")) | |
print(fmt:format("n", "Push Time", "Pull Time", "Push Mem", "Pull Mem")) | |
function math.round(n, p) return math.floor(n*p)/p end | |
local trials = 3 | |
for i = 8, 24, 4 do | |
local n = 2^i | |
local time_total_push, time_total_pull = 0, 0 | |
local memu_total_push, memu_total_pull = 0, 0 | |
local res_push, res_pull | |
for i = 1, trials do | |
collectgarbage("collect") | |
collectgarbage("collect") | |
local time_push = os.clock() | |
res_push = test_push(n) | |
time_push = os.clock()-time_push | |
time_total_push = time_total_push+time_push | |
memu_total_push = memu_total_push+collectgarbage("count") | |
collectgarbage("collect") | |
collectgarbage("collect") | |
local time_pull = os.clock() | |
res_pull = test_pull(n) | |
time_pull = os.clock()-time_pull | |
time_total_pull = time_total_pull+time_pull | |
memu_total_pull = memu_total_pull+collectgarbage("count") | |
end | |
print(fmt:format( | |
n, | |
math.round(time_total_push/trials, 10^6), | |
math.round(time_total_pull/trials, 10^6), | |
math.round(memu_total_push/trials, 10^6), | |
math.round(memu_total_pull/trials, 10^6) | |
)) | |
end | |
--[[ | |
LuaJIT 2.0.0-beta10 (Windows x64) | |
JIT: ON CMOV SSE2 SSE3 SSE4.1 fold cse dce fwd dse narrow loop abc sink fuse | |
n Push Time Pull Time Push Mem Pull Mem | |
256 0 0 63.247721 59.346679 | |
4096 0.002666 0.000999 183.346679 119.346679 | |
65536 0.036666 0.015333 2103.346679 1079.346679 | |
1048576 0.620666 0.272 32823.346679 16439.346679 | |
16777216 9.439666 4.227666 524343.346679 262199.346679 | |
]] |
fenix272
commented
Apr 4, 2024
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment