This is how I did it on an USB flash memory. The block size was found to be 8 kB, not 4 kB as many claim. Unfortunately, many programs have 4 kB as an upper limit.
So, how did I do it?
By dumping a copy of the flash back to the
flash, with different blocksizes, and timing it.
First the flash was read, under Linux as root, like this:
time dd of=q if=/dev/sdb bs=8kThat also gives the memory's reading bandwidth, which is always faster than the writing bandwidth, since writing takes time.
time dd if=q of=/dev/sdb bs=8kThis example has a blocksize of 8 kB, and /dev/sdb is the USB flash on my machine.
blocksize | seconds | time histogram | |
512 | B | 2559 | |
1 | kB | 2514 | |
2 | kB | 2335 | |
4 | kB | 2005 | |
8 | kB | 835 | |
16 | kB | 772 | |
32 | kB | 747 | |
64 | kB | 736 | |
128 | kB | 750 | |
256 | kB | 724 | |
512 | kB | 748 | |
1 | MB | 793 | |
2 | MB | 776 | |
The blocksize is obviously 8 kB, since this is the smallest blocksize that gives fast writing. Note that the speedup is about three, so a lot is gained by using this blocksize. Unfortunately, as I said before, many programs and devices have a 4 kB limit, taking about 2.5 times as long.
Other flash memories may have other block sizes and bandwidths.