What does the F() do exactly?

mkwired:
Do you really need to store data in FLASH? Doing so isn't "free." You will pay a performance penalty in terms of the time it takes to read from FLASH as well as the complexity in terms of the code necessary to access FLASH.

It's not that bad. In terms of time, the processor can read flash memory quickly. After all, it is getting instructions from it at the rate of a byte every clock cycle. Compare:

Flash "strcpy":

000000be <strcpy_P>:
  be:	fb 01       	movw	r30, r22
  c0:	dc 01       	movw	r26, r24
  c2:	05 90       	lpm	r0, Z+
  c4:	0d 92       	st	X+, r0
  c6:	00 20       	and	r0, r0
  c8:	e1 f7       	brne	.-8      	; 0xc2 <strcpy_P+0x4>
  ca:	08 95       	ret

To normal "strcpy":

000000cc <strcpy>:
  cc:	fb 01       	movw	r30, r22
  ce:	dc 01       	movw	r26, r24
  d0:	01 90       	ld	r0, Z+
  d2:	0d 92       	st	X+, r0
  d4:	00 20       	and	r0, r0
  d6:	e1 f7       	brne	.-8      	; 0xd0 <strcpy+0x4>
  d8:	08 95       	ret

The only difference is changing "ld" to "lpm". The LPM instruction takes 3 clock cycles compared to 2 for LD. So, you lose one clock cycle (62.5 nS) per byte copied.