With a brief skim, it looks like you are using heartbeat which are inherently expensive as they are tried to be executed every round. Even if the method doesn’t do much, the base-fee for inducting the heartbeat into the canister queue is 5M which might be the reason the canister is burning a lot of cycles. More reading here
Switching to a timers based approach with a higher interval should drop the cost significantly.