Pre-allocating the string sounds like a good idea, but in order to make it work, you then need to ensure that you overwrite the pre-allocated contents, not add to or replace them.
Two ways you might do this are substr and vec used as lvaues, but the reality (on my system:) is that using either is way slower than allowing perl to manage the process itself.
C:\test>241328 Name "main::substr" used only once: possible typo at C:\test\241328.pl + line 6. Name "main::bytewise" used only once: possible typo at C:\test\241328. +pl line 5. Name "main::vec" used only once: possible typo at C:\test\241328.pl li +ne 7. Benchmark: running bytewise, substr, vec , each for at least 5 CPU seconds ... bytewise: 5 wallclock secs ( 5.17 usr + 0.01 sys = 5.18 CPU) @ 1 +.55/s (n=8) Use of uninitialized value in substr at (eval 6) line 1. substr: 6 wallclock secs ( 6.05 usr + 0.00 sys = 6.05 CPU) @ 0 +.83/s (n=5) vec: 6 wallclock secs ( 5.22 usr + 0.00 sys = 5.22 CPU) @ 0 +.96/s (n=5) s/iter substr vec bytewise substr 1.21 -- -14% -47% vec 1.04 16% -- -38% bytewise 0.647 87% 61% -- C:\test>
I suspect that the best answer is to try and avoid producing your data 1 byte at a time. If you identified that process, there might be alternative ways of acheiving it more efficiently.
In reply to Re: what's faster than .=
by BrowserUk
in thread what's faster than .=
by xafwodahs
| For: | Use: | ||
| & | & | ||
| < | < | ||
| > | > | ||
| [ | [ | ||
| ] | ] |