Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Why error() works faster then assert() in Lua?

Assertion of condition is well known way to design application in strategic way. You could be completely sure that your code will work correctly a day after release, but also when other dev in your team will change this code.

There are 2 common ways to put assertion in Lua code:

assert(1 > 0, "Assert that math works")
if 1 <= 0 then
    error("Assert that math doesn't work")
end

I would expect this thing similar from performance point of view. Consider it only matter of style. But it happens to be not true.

assert works longer on my machine:

function with_assert()
    for i=1,100000 do 
        assert(1 < 0, 'Assert')
    end
end

function with_error()
    for i=1,100000 do 
        if 1 > 0 then
            error('Error')
        end
    end
end

local t = os.clock()
pcall(with_assert)
print(os.clock() - t)

t = os.clock()
pcall(with_error)
print(os.clock() - t)

>> 3.1999999999999e-05

>> 1.5e-05

Why does it happen?

like image 929
Kirill Lubavsky Avatar asked Oct 30 '25 09:10

Kirill Lubavsky


1 Answers

Look at the source code of assert and error: assert does some work and then calls error.

But the loop in your code serves no purpose: throwing an error during the first iteration means that the rest of the iterations don't run. Perhaps you meant to put the loop around the pcalls as below. Then you'll find hardly any difference between the times.

function with_assert()
    assert(1 < 0, 'Assert')
end

function with_error()
    if 1 > 0 then
        error('Error')
    end
end

function test(f)
    local t = os.clock()
        for i=1,100000 do 
            pcall(f)
        end
    print(os.clock() - t)
end

test(with_assert)
test(with_error)
like image 71
lhf Avatar answered Nov 01 '25 13:11

lhf



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!