I was curious about how fast I can transfer data in various contexts. I did some informal benchmarks: these are not scientific, and your results might be different.

The data transferred is a one terabyte sparse file:

$ truncate --size 1T terabyte

First is just copying files on a disk: from the file to /dev/null.

software sender receiver time (s) speed (MB/s)
cat exolobe1 exolobe1 274 3826
dd exolobe1 exolobe1 2729 384
dd bs=1M exolobe1 exolobe1 304 3449
dd bs=16M exolobe1 exolobe1 314 3338
dd bs=1G exolobe1 exolobe1 328 3196

Conclusion: cat is quite good, and setting almost any size buffer on dd is a win over the default. (dd has other options that cat lacks, such as oflag=direct, which means its still interesting for me, despite a little slower than cat.)

Then network transfers. I use the fling software, which is quite efficient when security is not needed. It does not handle sparse files specially.

Source of the transfer is my laptop (exolobe1), target is the same machine over localhost, a VM under libvirt on the same laptop, a VM under qemu-system on the same laptop, or my server (exolobe2), or a VM on the server (holywood2).

$ fling -p terabyte receiver 8888     # sender
$ receiver: fling -r 8888 > /dev/null # receiver

For extra kicks, transfers between nested VMs inside a VM on the laptop, where the outer VM is running under libvirt or qemu-system. The nested VMs always run under libvirt.

software sender receiver time (s) speed (MB/s)
fling exolobe1 exolobe1 395 2655
fling exolobe1 libvirt guest 613 1710
fling exolobe1 qemu-system-x86_64 4653 225
fling exolobe1 exolobe2 too long 111
fling exolobe1 holywood2 too long 78
fling nested libvirt-guest other nested guest too long 280
fling nested qemu-system other such too long 12

The "too long" results is because I got impatient. The speeds in those cases are from fling -p output.

Conclusion: localhost is fast. libvirt networking inside the same physical machine is fast. Every other case is slow.

I hope that's useful to someone.