dd is a general purpose data moving command. It's sometimes used for moving data from one raw disk to another but it's a flexible command and doesn't care what kind of files or devices it's talking to.
dd by itself just reads stdin and writes back to stdout, so dd < filename > newfile is effectively the same thing as cp.
It does it in blocks of 512 bytes by default, which is a bit inefficient, so dd bs=1048576 < filename > newfile may be much faster. Beyond a certain point making the buffer bigger doesn't help.
So all I'm doing is having dd read from one file and write to another, and while it's running, sending it the signal SIGUSR1 which casues it to print statistics. Or you could wait for it to end, or kill it with ctrl-C, and it'll print statistics as it ends.
cache effects are when the OS doesn't immediately store what you've written to file on disk, just in memory. This is great for programs since they don't have to wait for the disk to catch up but troublesome for benchmarks. dd in linux supports the oflag=sync option to tell it not to do that.