in reply to Re^3: looping efficiency (Benchmark Example)
in thread looping efficiency

Don’t Optimize Code -- Benchmark It

-- from Ten Essential Development Practices by Damian Conway

The real problem is that programmers have spent far too much time worrying about efficiency in the wrong places and at the wrong times; premature optimization is the root of all evil (or at least most of it) in programming

-- Donald Knuth

No one has yet linked to Devel::NYTProf. It's a great tool to find out where your code really wastes CPU and time. Just run your script like this ...

perl -d NYTProf yourscript.pl foo bar baz

... followed by ...

nytprofhtml --open

... and look for the code that takes the longest time to run. That's where you want to start optimizing.

Commit your current version to git/SVN/CVS/whatever, modify, run through NYTProf again until speed improves. Revert and retry if speed goes down. Commit, re-profile, opimize the next top problem from NYTProf. Stop when the code is sufficiently fast.

Alexander

--
Today I will gladly share my knowledge and experience, for there are no sweeter words than "I told you so". ;-)

Replies are listed 'Best First'.
Re^5: looping efficiency (B::Terse OP codes)
by eyepopslikeamosquito (Archbishop) on Dec 31, 2020 at 20:46 UTC

    Oh yes, Devel::NYTProf is a fantastic tool!

    Just for completeness, you can examine the OP codes generated for different snippets of Perl code via B::Terse. For example:

    > perl -MO=Terse -e "sprintf q{%04d}, $_" (Windows) > perl -MO=Terse -e 'sprintf q{%04d}, $_' (Unix) LISTOP (0x254e078) leave [1] OP (0x2753080) enter COP (0x254e0b8) nextstate LISTOP (0x254e118) sprintf [2] OP (0x254e158) pushmark SVOP (0x254e1f8) const [3] PV (0x254f200) "%04d" UNOP (0x254e188) null [14] PADOP (0x254e1c0) gvsv GV (0xd6af50) *_ -e syntax OK > perl -MO=Terse -e "qq{$i$j$k$l}" (Windows) > perl -MO=Terse -e 'qq{$i$j$k$l}' (Unix) LISTOP (0x2806210) leave [1] OP (0x28061e0) enter COP (0x2806250) nextstate UNOP_AUX (0x28062b0) multiconcat [8] OP (0x28062f0) null [3] UNOP (0x664fe0) null [14] PADOP (0x665018) gvsv GV (0x65fbb0) *i UNOP (0x664f70) null [14] PADOP (0x664fa8) gvsv GV (0x6549e8) *j UNOP (0x664ec0) null [14] PADOP (0x664ef8) gvsv GV (0x65ff10) *k UNOP (0x2806360) null [14] PADOP (0x2806398) gvsv GV (0x654b68) *l -e syntax OK > perl -MO=Terse -e "$i.$j.$k.$l" (Windows) > perl -MO=Terse -e '$i.$j.$k.$l' (Unix) LISTOP (0x27d23b0) leave [1] OP (0x27d2380) enter COP (0x27d23f0) nextstate UNOP_AUX (0x27d2450) multiconcat [7] UNOP (0x25d2d70) null [14] PADOP (0x25d2da8) gvsv GV (0x25c4d78) *i UNOP (0x25d2d00) null [14] PADOP (0x25d2d38) gvsv GV (0x25c49b8) *j UNOP (0x25d2c50) null [14] PADOP (0x25d2c88) gvsv GV (0x25d01b0) *k UNOP (0x27d2490) null [14] PADOP (0x27d24c8) gvsv GV (0x25c4e38) *l -e syntax OK

    No great surprise to see qq{$i$j$k$l} and $i.$j.$k.$l generating the same OP codes under the covers.

    Updated: added Unix versions of perl command lines