How about random sleeps distributed so that the mean sleep time is always the same for every computation? (and much longer than any likely computation).
timer.start();
computation();
time = timer.stop();
sleep(random_centered_on(mean-time));
timer.start();
computation();
time = timer.stop();
sleep(random_centered_on(mean-time));
And it doesn't prevent against indirect sidechannels. For instance, seeing how long other requests take.