This module exports a
@timeit macro that works similarly to the
magic in IPython.
THIS PACKAGE IS DEPRECATED: It no longer works correctly on Julia v0.7+ due to scoping changes in Julia. Use
@btime from BenchmarkTools.jl instead.
julia> using TimeIt julia> x = rand(10000); y = rand(10000); julia> @timeit x .* y; 10000 loops, best of 3: 13.71 µs per loop
The time per loop in seconds is returned, so you can do
t = @timeit x .* y
to record the timing.
TL;DR: For a more rigorous benchmarking experience, check out Benchmarks.jl.
@timeit wraps the supplied expression in a loop with an appropriate number of iterations and times the execution. For example,
@timeit x .* y becomes something like
# record start time for i in 1:10000 val = x .* y end # record end time
As such, when you run
@timeit x .* y in global scope (at
the REPL), you're running a loop in global scope, which has a
non-negligible overhead. Even a do-nothing expression takes a
minimum of about 100 ns per iteration:
julia> @timeit nothing 1000000 loops, best of 3: 98.05 ns per loop
For expressions that take more than approximately 1µs, this overhead becomes negligible.
Again, because the loop is in global scope, complex expressions will have
poor performance. Consider an alternative way to compute
x .* y:
julia> @timeit [x[i] * y[i] for i=1:length(x)] 100 loops, best of 3: 3.06 ms per loop
Placing this expression in a function results in a factor of 100 speed-up:
julia> f(x, y) = [x[i] * y[i] for i=1:length(x)] f (generic function with 1 method) julia> @timeit f(x, y) 10000 loops, best of 3: 32.44 µs per loop
10 months ago