The most efficient block size will depend on lots of things, but the memory page size of your OS will likely be the most significant. 32 bytes is way too small, I'd start with 4k or 8k and go up from there. Why not try several different multiples of 4K and see which one works best for you?
Also, read returns the number of bytes actually read so there's really no need to use length.
my $len = read($in,$buf,4*1024);
...
And $len is an integer so it would be better to use the numeric not equal '!=' rather than the pattern match operator.