tar will do this for you really fast.
###TEST
First I created 2 directories and 10 files:
% mkdir test1 test2 ; cd test1
% for n in `seq 1 10` ; do touch ABC.file$n ; done
% ls
> ABC.file1 ABC.file2 ABC.file4 ABC.file6 ABC.file8
> ABC.file10 ABC.file3 ABC.file5 ABC.file7 ABC.file9
Then I copied them:
% tar -cf - ./* |\
tar -C../test2 --transform='s/ABC/DEF/' -xf -
% ls ../test2
> DEF.file1 DEF.file2 DEF.file4 DEF.file6 DEF.file8
> DEF.file10 DEF.file3 DEF.file5 DEF.file7 DEF.file9
###TRANSFORM
So GNU tar will accept a sed --transform=EXPRESSION for file renaming. This can even rename only some of the files. For instance:
% tar -cf - ./* |\
tar -C../test2 --transform='s/ABC\(.*[0-5]\)/DEF\1/' -xf -
% ls ../test2
> ABC.file6 ABC.file8 DEF.file1 DEF.file2 DEF.file4
> ABC.file7 ABC.file9 DEF.file10 DEF.file3 DEF.file5
So that's one advantage.
###STREAM
Also consider that this is only two tar processes - and that will not alter regardless of your file count.
tar | tar
tar is as optimized as you could want it to be. This will never have problem argument counts or runaway child processes. This is just A > B done.