I Thought I might make mention as to WHY filter is alot lot faster.

/filter well pass through the file ONCE filtering the lines into the result destination (file/window/etc)

each $read() well read from the front of the file upto the line selected, so just to get the number of lines takes an entire read of the file (excluding files with number of lines on first line)
So say a 10 line files size is stored in %i (read 10 lines)
then read line number %i (10) (read 20 lines), then dec %i
then read line number %i (9) (read 29 lines), then dec %i
then read line number %i (8) (read 37 lines), then dec %i
then (7) 44 (6) 50 (5) 55 (4) 59 (3) 62 (2) 64 (1) 65 lines read in total
The number of total reads of the file can normally be worked out as about 1 total read for every 2 lines, thats 250,000 complete readings of the file on a 500,000 line file verses 1

* fread doesnt have this problem of course.