OwnTime provides two additional ways to view Julia's Profile data.
I consider OwnTime to be feature complete. If there have not been any recent commits, it's not because OwnTime is abandoned, it's because OwnTime is complete.
Furthermore, OwnTime consists of less than 200 lines of code in a single file, and the code is documented. If worse comes to worse, you could maintain it yourself without much effort.
Use Julia's package manager to install.
In the Julia REPL do:
using Pkg
Pkg.add("OwnTime")Let's say we have the following code in mycode.jl:
function myfunc()
A = rand(200, 200, 400)
maximum(A)
endWe profile our code in the usual way:
julia> include("mycode.jl")
myfunc (generic function with 1 method)
julia> myfunc() # run once to force JIT compilation
0.9999999760080607
julia> using Profile
julia> @profile myfunc()
0.9999999988120492We can now view our profiling data using owntime or totaltime:
julia> owntime()
[1] 63% => dsfmt_fill_array_close_open!(::Random.DSFMT.DSFMT_state, ::Ptr{Float64}, ...) at DSFMT.jl:95
[2] 13% => _fast at reduce.jl:454 [inlined]
[3] 11% => eval(::Module, ::Any) at boot.jl:330
[4] 8% => Array at boot.jl:408 [inlined]
[5] 1% => != at float.jl:456 [inlined]
julia> totaltime()
[1] 96% => eval(::Module, ::Any) at boot.jl:330
[2] 96% => (::REPL.var"#26#27"{REPL.REPLBackend})() at task.jl:333
[3] 96% => macro expansion at REPL.jl:118 [inlined]
[4] 96% => eval_user_input(::Any, ::REPL.REPLBackend) at REPL.jl:86
[5] 72% => myfunc() at mycode.jl:2
[6] 72% => rand at Random.jl:277 [inlined]
[7] 63% => rand(::Type{Float64}, ::Tuple{Int64,Int64,Int64}) at gcutils.jl:91
...
[11] 14% => myfunc() at mycode.jl:3
...totaltime show the amount of time spent on a StackFrame including its sub-calls. owntime shows the amount of time spent on a StackFrame excluding its sub-calls.
We can filter StackFrames to shorten the output:
julia> owntime(stackframe_filter=filecontains("mycode.jl"))
[1] 72% => myfunc() at mycode.jl:2
[2] 14% => myfunc() at mycode.jl:3
julia> totaltime(stackframe_filter=filecontains("mycode.jl"))
[1] 72% => myfunc() at mycode.jl:2
[2] 14% => myfunc() at mycode.jl:3
julia> owntime(stackframe_filter=stackframe -> stackframe.func == :myfunc)
[1] 72% => myfunc() at mycode.jl:2
[2] 14% => myfunc() at mycode.jl:3It's now clear that 72% of the time was spent on line 2 of our code, and 14% on line 3. The rest of the time was spent on overhead related to Julia and profiling; for such a small example a relatively large amount of time is spent on that overhead.
stackframe_filter should be passed a function that accepts a single StackFrame and returns true if that StackFrame should be included.
OwnTime merely provides an alternate view into the profiling data collected by Julia. It is complimentary to the Profile package in the standard library.
totaltime provides a view of the profiling data similar to the flat format of Profile.print(format=:flat).
owntime is a view unique to OwnTime*, hence the name.
The ability to filter StackFrames is unique to OwnTime*.
(* At this time, and as far as I'm aware.)