Не замерял скорость. И даже не смотрел в дизасемблере реализацию.
Но предлагаю просто разложить обе операции на примитивные ассемблерные инструкции (где нет инкремента, данные хранятся в памяти, а считаются в регистрах). Примерно так будет в псевдокоде:
int preinc(int i) {
mov r1, [i];
add r1, 1;
mov [i], r1;
return r1;
}
int postinc(int i) {
mov r1, [i];
mov r2, r1;
add r2, 1;
mov [i], r2;
return r1;
}
Видно, что у постфиксного варианта на одну операцию больше, чем у префиксного. А так же постфиксный использует 2 регистра, тогда как префиксный 1.
Логика работы префиксного проще и понятней. Так что используйте по умолчанию всегда префиксный. И только тогда когда действительно необходимо постфиксный.
А теперь представьте, что операция производится не надо встроенным типом, а надо классом. В этом случае дополнительные затраты могут быть гораздо существенней.