Gallery

Fibonacci

Serial fibonacci

using EventTracker

function fib(n)
    n <= 1 && return n
    @recordinterval :fib1 a = fib(n - 1)
    @recordinterval :fib2 b = fib(n - 2)
    return a + b
end

EventTracker.clear()
fib(10)

df = EventTracker.summary_dataframe()

2 rows × 9 columns

ncallstimetaglinefile_modulefirstcalleventkindlocationid
Int64Float64Union…?Int64?Union…?Module?UInt64EventKi…UInt64
1885.65909e-7fib14noneMain.ex-fibonacci-serial226476430345EVENT_INTERVAL139935178511776
2883.11364e-7fib25noneMain.ex-fibonacci-serial226476431145EVENT_INTERVAL139935178511824
using Plots
stks = EventTracker.stacks()
plot(stks)

Parallel fibonacci

using EventTracker

function fib(n)
    n <= 1 && return n
    t = @async begin
        rand(Bool) && yield()  # introduce more task jugglings
        @recordinterval :fib1 fib(n - 1)
    end
    @recordinterval :fib2 b = fib(n - 2)
    return (fetch(t)::Int) + b
end
function withspin(f)
    done = Threads.Atomic{Bool}(false)
    @sync begin
        Threads.@spawn begin
            while !done[]
                @recordpoint :spin
                yield()
            end
        end
        try
            f()
        finally
            done[] = true
        end
    end
end

function run_fibs_with_spin(nums)
    withspin() do
        for n in nums
            fib(n)
        end
    end
end
run_fibs_with_spin([5, 6, 7])  # invoke compilation
EventTracker.clear()
run_fibs_with_spin([5, 6, 7])

df = EventTracker.summary_dataframe()

3 rows × 9 columns

ncallstimetaglinefile_modulefirstcalleventkindlocationid
Int64Float64?Union…?Int64?Union…?Module?UInt64EventKi…UInt64
1391.19899e-5fib28noneMain.ex-fibonacci-spin263198325977EVENT_INTERVAL139935166336832
236missingspin6noneMain.ex-fibonacci-spin263198331477EVENT_POINT139935178695600
3392.06489e-5fib16noneMain.ex-fibonacci-spin263198335877EVENT_INTERVAL139935166336784
using Plots
stks = EventTracker.stacks()
plot(stks)

Tarai

Ref: Tak (function) - Wikipedia

using EventTracker

function tarai(x, y, z)
    @recordinterval if y < x
        tarai(
            tarai(x - 1, y, z),
            tarai(y - 1, z, x),
            tarai(z - 1, x, y),
        )
    else
        @recordpoint
        y
    end
end

EventTracker.clear()
tarai(3, 1, 7)
df = EventTracker.summary_dataframe()

2 rows × 9 columns

ncallstimetaglinefile_modulefirstcalleventkindlocationid
Int64Float64?Union…?Int64?Union…?Module?UInt64EventKi…UInt64
14611.17226e-63noneMain.ex-tarai-serial266508886047EVENT_INTERVAL139934636379824
2346missing10noneMain.ex-tarai-serial266508886447EVENT_POINT139934636380544
using Plots
stks = EventTracker.stacks()
plot(stks)