follow Erlang efficiency guide, replace timer:xxx to erlang:send_after