You can also generate brand new systems if you play around with peripheral calls and disk drives. Spawn a new system next to your command computer, boot it and get its ID, shift it near a disk drive (or perhaps INTO a disk drive) so it can be configured, then finally shift it to where ever you actually want it to end up…
(unless you can make coroutines which'll each get one block and do it that way?)
You probably can; I never rigged my world scanner to use command.getBlockInfo
s(), but use of coroutines still allowd it to read over a hundred blocks per server tick. So presumably it'd operate at about half speed if it started using blockdata in addition to getBlockInfo (well, probably something like 90% speed, bearing in mind that it could be rigged to skip NBT reading on most blocks which are known not to be tile entities, such as air / dirt / stone…).
Note that yielding does not, in itself, take "a server tick" - it's pretty much instant, and you can effectively resume as soon as the event you're after appears in the queue. In this particular case ("commands API functions") it takes
longer than a tick for each event to show up (which can fortunately be dealt with by requesting tons of the things concurrently), but the time varies depending on the event you're talking about (most are
also pretty much instant - it's
usually only those related to third-party peripherals that have any notable delay).