Yea, for small commands it's unnecessary... but by the same token it's not a ton of overhead (and can be reduced if necessary, I can even write a custom char buffer it really comes down to it). But when you give an order to 10,000 units that's 10,000 concats (Edit: actually 20,000 since the comma characters are appended separately), each of which has to allocate memory for the entire working string plus the next item and then copy the contents to the new string, so the last 1000 concats could be consuming and copying around 7 * 9000 * 2 bytes _each_. Anyway, I changed the move, transport, assist, attack, and wormhole list builders to use stringbuilders for now, will see if there are any others.
Also just finished with code that uses a "square move" algorithm very similar to arc-move except filled in (and, well, square since it doesn't require any trig calls) for any non-arc, non-formation move of over 500 units at once. It totally avoids the huge cost of the preventative displacement, so the game can play relatively smoothly even with giving frequent move orders to 10k blobs. It still slows down a fair bit when those ships "settle" as its having to do collision checks then, perhaps we could look into that later, but it's not an eons-long delay.
Anyway, commiting all that...