I noticed that RStudio has a high CPU load while running do on data frames with many groups and short operations. I traced this to the fact that the progress bar is re-drawn for each tick, even if it hasn't changed since the last update.
I therefore added a check for when the progress bar has been drawn the last time, and update only if this is more than 50 ms ago. A simple test revealed that this can save a lot of overhead without noticeable changes (first run: normal dplyr, second run: with last_update check):
> d <- data.frame(x=1:100000)
> system.time(invisible(d %>% group_by(x) %>% do(x=0)))
|==========================================================================================|100% ~0 s remaining
user system elapsed
33.535 2.976 28.715
Restarting R session...
> library(dplyr)
> system.time(invisible(d %>% group_by(x) %>% do(x=0)))
|========================================================================================= | 99% ~0 s remaining
user system elapsed
3.845 0.109 4.009