Juliaで実行時間を制限する用のタイマー



ヒューリスティックな手法などで、 適当に定めた時間だけ探索して打ち切りたいという場合があります。
競プロなどでも使える簡単めでシンプルめなJuliaでの実装を書きました。

mutable struct Timer
    timeout::Millisecond
    created::DateTime
end

function Timer(timeout_ms::Int)
    return Timer(Millisecond(timeout_ms), Dates.now())
end


function is_timeout(x::Timer)
    now_time = Dates.now()
    elapsed_time = now_time - x.created
    return elapsed_time >= x.timeout
end

 
function reset!(x::Timer)
    x.created = Dates.now()
end

 
function rate(x::Timer)
    now_time = Dates.now()
    elapsed_time = now_time - x.created
    return x.timeout / elapsed_time
end


使い方は、
function solve()
    # 1000 [ms] (1 [s]) でタイムアウトするタイマーを作成
    timer = Timer(1000)
    while !(is_timeout(timer))
        do_something()
    end
end


という感じです。
reset! で計測のリセット、 rate で経過時間の割合を取得できます。 (焼きなまし法などで使う用です。)