#!/usr/bin/env luajit local os = require("os") local xmath = require("xmath") -- XXX: perf regression? (See below PERF_REGRESSION) -- No, happens only with Clang build. (Why?) local N = os.exit and (arg[1] and tostring(arg[1])) or 1e5 --1e6 local A,B = {}, {} local V,W = {}, {} local randvec local args = { ... } local ourname = args[1] if (os.exit) then local math = require("math") randvec = function() return xmath.vec2(math.random(), math.random()) end print("Running stand-alone. ourname: "..tostring(ourname)) else local randgen = require("randgen") local s = randgen.new(true) -- NOTE: factoring out the inner s:getdbl() into a separate function -- reduces performance seriously (about an order of magnitude!) randvec = function() return xmath.vec2(s:getdbl(), s:getdbl()) end -- Test optional arguments from our_require(). printf("Running %s embedded with opt arg %s", ourname, tostring(args[2])) end local t1 = os.clock() if (os.exit == nil) then local randgen = require("randgen") local r = randgen.new(true) for i=1,4*2*N do -- This is to test the performance compared to a direct -- ffiC.rand_jkiss_dbl() call in randgen.lua r:getdbl() end end local t2 = os.clock() -- init random points and vectors for i=1,N do A[i] = randvec() B[i] = randvec() V[i] = randvec() W[i] = randvec() end local t3 = os.clock() local v = xmath.vec2(0, 0) for i=1,N do local intersp = xmath.intersect(A[i],V[i], B[i],W[i], true) if (intersp ~= nil) then v = v + intersp end end local t4 = os.clock() -- x86_64 (embedded): approx. 200 ms (vs. the 100 ms of direct -- ffiC.rand_jkiss_dbl()): -- x86: 170 ms print("getdbl: ".. 1000*(t2-t1)) print("genpoints: ".. 1000*(t3-t2)) -- x86_64: 500 ms, x86: 700 ms print("intersect: ".. 1000*(t4-t3)) -- x86_64, x86: about 35 ms <- thanks to allocation sinking (else, about 500 ms?) print("result: ".. tostring(v)) -- PERF_REGRESSION: with N==1e6 getdbl, genpoints now about 1000ms from EDuke32!