My tests show that $* is approximately 3 times faster. Probably because there's less code to interpret.
Actually it looks like it's
at least a couple orders of magnitude faster. Your script isn't showing it properly because the resolution of $ticks (at least on my system) is somewhere around 15-16 ms.
For example, try this code:
http://pastebin.com/6tNKWjpR (It takes about 7 seconds to do the loop test on my system, so don't be alarmed if it takes some time to finish.)
My results for this code:
This actually makes a lot of sense. It appears that the speed issue isn't with the while loop, but instead the problem is the need to use either $gettok or string concatenation to reference the i-th token, which is very slow (relatively speaking).
Also note that by replacing
noop $calc( [ $+($,%i) ] *3)
with
noop $calc( $($+($,%i),2) *3)
the code is actually even slower, around 9-10 seconds on my system. It seems that $() is noticeably less efficient than using brackets.
Ultimately though it comes down to the issue that modifying $* would break some old scripts. Although there's nothing preventing Khaled from adding a new identifier that does the same thing as $* but works in the way you are asking for.