• balsoft@lemmy.ml
    link
    fedilink
    English
    arrow-up
    3
    ·
    12 days ago

    Typically this is true, but it’s certainly possible to get comparable performance with functional style

    It’s possible, but you have to specifically write code that’s fast, rather than idiomatic or ergonomic, and you have to know what you’re doing. At that point, you may have been better off writing it in something else. I feel like OCaml is good at this because it allows you to write abstractions and main control flow in a functional way and hot paths in an imperative way without switching language, but so is Rust.

    Carp, which I linked above, basically uses the same approach to memory management as Rust. It doesn’t rely on GC.

    I’ll take a look, thanks!

    I also find that for most cases it really doesn’t matter all that much unless you’re in a specific domain like writing drivers, making a game engine, etc. Computers are plenty fast nowadays, and ergonomics tend to be more important than raw performance.

    I mostly agree with you, e.g. Haskell and Clojure, despite being “slow”, are plenty fast for what they’re used for. On the other hand, I’m very much annoyed when “user-facing” software takes way too long to load or do simple tasks. Java in particular is pretty bad at this: JOSM (Java OpenStreetMap editor) takes longer to load than my entire desktop startup, including a window manager and browser. Unfortunately it’s also the best editor around, so I pretty much have to use it to edit OSM, but it still annoys me to no end. Unnecessary computations, IO inefficiencies and layers of wrapping also affect the power consumption quite noticeably.

    • ☆ Yσɠƚԋσʂ ☆@lemmy.mlOP
      link
      fedilink
      arrow-up
      2
      ·
      12 days ago

      Functional programming tends to get conflated with static typing and immutability, but it’s a much broader paradigm than that. I find it really depends on the specific language. It’s very easy to do local mutation in Clojure for example. There are constructs like transient specifically designed for doing that. There are also languages like Janet that are functional, but use mutable constructs by default and can embed in C with very low footprint.

      I generally get annoyed with software being slow to startup and hogging resources as well, but that’s a separate discussion. The JVM is designed primarily for servers where you have long running processes, and startup time isn’t really a big concern. So, it’s not the best illustration. A CL app written using something like clog will be very snappy.

      Joe Armstrong made a good point a while back as well. He pointed out that it’s better to focus on making the compiler smarter so that it can do the optimize performance, and optimize languages for human readability. I very much agree with that sentiment. We can see an example of that being done with GraalVM which can compile JVM bytecode into optimized native apps that have very fast startup time and use far less resources than the JVM. At the moment it’s not comprehensive, but you can make GUI apps with it, and they’ll even run on RPi.