in reply to Re^2: Why does each() always re-evaluate its argument? (Updated x2 - experimental "for_list" )
in thread Why does each() always re-evaluate its argument?

> but, sadly, did not run appreciably faster

experimental "for_list" solves so many issues of each , that I'm already very happy if it's not slower.

It's elegant, orthogonal and intuitive, and I hope the experimental phase will be a success.

This benchmarks claims it to be much faster, but we all know how tough it is to write reasonable benchmarks which don't compare apples with oranges.

Actually I'm surprised that copying large hashes into a list can even compete with the built-in iterator-counter of perl hashes used by 'each'.

The implemention must be very clever. Or the overhead will only show with much larger hashes.

Cheers Rolf
(addicted to the Perl Programming Language :)
see Wikisyntax for the Monastery

  • Comment on Re^3: Why does each() always re-evaluate its argument? (Updated x2 - experimental "for_list" )
  • Download Code

Replies are listed 'Best First'.
Re^4: Why does each() always re-evaluate its argument? (Updated x2 - experimental "for_list" )
by ikegami (Patriarch) on Dec 07, 2023 at 01:58 UTC

    Actually I'm surprised that copying large hashes into a list can compete with the built-in iterator of perl hashes.

    1) There's no copying, and 2) it uses the built-in iterator.

    When we say "returns a list", we simply mean "returns zero or more scalars". It's not a data structure. You don't copy into a list since there's no such thing. We're talking about pushing pointers onto the stack. Which is exactly what keys, each or any other approach would have to do as well. There's no extra work here, so it shouldn't be surprising that it's not any slower.

      > 1) There's no copying,

      If that's so, then the docs should be clearer:

      > 2) it uses the built-in iterator.

      In that case, I suppose nested loops over the same hash are covered by saving and restoring the localized iterator?

      I was expecting a more intelligent solution than literally "copying to a flat list" but this also leads to another question:

      What happens if the hash is altered inside the loop, if it's not copied "before the loop starts"

      Cheers Rolf
      (addicted to the Perl Programming Language :)
      see Wikisyntax for the Monastery

        In that case, I suppose nested loops over the same hash are covered by saving and restoring the localized iterator?

        Nope, no need. Like you quoted, the hash's contents are fetched up front.