Push ifs up and fors down: The idiom, its algebra, and its limits

(debasishg.github.io)

63 points | by speckx 3 hours ago

10 comments

  • gorgoiler 6 minutes ago
    Erm, no? You write f(w: Walrus) -> Walrus and then let the caller handle Walrus|None and Iterable[Walrus] however they wish!

    And if someone decides the codebase needs an abstraction over (and therefore specific functions to handle) Iterable[Walrus|None] then you check the weather and suggest they take a break and go for a stroll. (You check the weather to see if you should lend them your brolly.)

    What am I missing?

  • socializer 2 hours ago
    I am continually impressed by the ability of LLMs to take trivial ideas and turn them into lengthy and obtuse blog posts with unnecessary analogies.
    • swiftcoder 1 hour ago
      Honestly, this just looks like one of those lingo-heavy-but-surface-level blog posts that used to make functional programming spaces so insufferable to everyone on the outside
      • mahboi 1 hour ago
        These things are so divorced from the reality of programming, even when they involve actual code instead of fancy lingo. Like in Scala, not a pure functional language, tutorials used to find the most convoluted higher-order functional way to do simple things.
    • bioneuralnet 2 hours ago
      Yet another encroachment on traditionally human activity.
      • moritzwarhier 2 hours ago
        I am the

          Option<Walrus>
        • msdz 23 minutes ago
          I know we’re not supposed to comment just for that, but this might be my single favorite joke comment I’ve ever read here. Good job.
      • jibalt 16 minutes ago
        Except that TFA is a bog standard example of traditional human activity and the GP's comment is nonsensical trolling.
  • ninalanyon 1 hour ago
    I've done this for years. Not every time of course but where it makes the code easier to understand and maintain.

    Speed was almost never the reason.

    • alterom 1 hour ago
      I take it you never rewrote a Matlab for loop as a vector/matrix op for insane speedups then :)
  • wallstop 1 hour ago
    What is missing here is any benchmarks backing up this argument for code structure.

    Of note, as of C#9 (and maybe prior), the dotnet runtime does this automatically whenever it is deemed safe. https://devblogs.microsoft.com/dotnet/performance-improvemen...

    The same technique is applied as an optimization, when deemed safe, in all current gen c compilers (gcc, llvm, etc).

    I'm very confused why neither measurements nor references to when this is done automatically in most modern languages is included in the article.

    • Maxatar 6 minutes ago
      Can't speak for C# but in C/C++ the optimization can rarely be applied safely due to aliasing. If any part of the data you're working with involves a char* then C/C++ optimizers refrain from doing these kinds of optimizations because of how difficult it is to guarantee the absence of mutability.
    • cogman10 1 hour ago
      At least in JVM land, it's pretty easy to thwart that optimization. Particularly if the condition is on a mutable yet unchanged in the loop value.

      For example:

          var map = new HashMap<String, String>();
          map.put("foo", "bar");
          for (var i : items) {
            if ("bar".equals(map.get("foo")) {
              doStuff(i);
            }
          }
      
      Even though `map` isn't mutated, it's hard enough for the JVM to detect and the underlying `get` functions are complex enough that it'll run the `get("foo")` every time, which can be quiet expensive.
  • dieselgate 47 minutes ago
    Didn’t see it mentioned in the article but isn’t leading with if-statement called a “guard clause”. I like that pattern but it’s just general best practice I thought.
  • throwawayffffas 26 minutes ago
    Just the branch predictor gains are probably worth it.
  • aappleby 1 hour ago
    I have always phrased this as "Never do one of something".
  • OutOfHere 1 hour ago
    I like it, but to do fizzbuzz in this way, you'd have to separate what's inside the loop into a reused function.
  • alterom 1 hour ago
    TL;DR in one sentence:

    "the loop runs without a branch, and is a candidate for vectorization".

    That's it, that's the article. This matters a lot in huge-scale / scientific computing / HPF, where if you can express something as an operation on vectors on matrices, you win big (those ops parallelize well, can be run on GPUs, clusters, what have you).

  • apefulsin 1 hour ago
    [dead]