Skip to content
HomeVideosBooksBlogs
AllTop postsTopics
Podcasts
HistoryListsWatch laterLiked videosFollowing

The videos, books, blogs and podcasts Hacker News keeps recommending, all in one place.

VideosBooksBlogsPodcastsAboutPrivacySettings

Data from Hacker News, HackerTube, HackerBooks, HackerBlogs and Open Library. Credits · Not affiliated with Y Combinator.

HomeVideosBooksBlogsPodcasts
Ctrl K
    C

    Clojure Goes Fast

    clojure-goes-fast.com · Personal blog · on HN since 2017

    Clojure Goes Fast covers Clojure and JVM performance, including profiling, benchmarking with JMH, reflection, and garbage collection.

    Visit blogRSSHN submissions
    Systems & PerformanceLanguages & CompilersProgramming
    What HN says

    HN commenters recommend it as a resource for pushing Clojure performance limits, and cite its Shenandoah GC production report as necessary reading at scale.

    Stats for nerds
    24HN people shared it
    18linked in comments
    221story points
    Apr 2026last shared
    2018people per year2026

    Top posts on HN

    1. 1
      Shenandoah GC in production: experience report
      5 people · 179 points · first shared 2019 · 124 comments on HN
    2. 2
      Clojure's slow start – what's inside?
      9 people · 20 points · first shared 2018 · Discussion on HN
    3. 3
      Clojure's Deadly Sin
      5 people · 7 points · first shared 2023 · Discussion on HN
    4. 4
      A central hub for news, docs, and guides about Clojure and high performance
      3 people · 3 points · first shared 2019 · Discussion on HN
    5. 5
      Java's Project Valhalla vs. ray tracer: will it go faster?
      1 person · 3 points · first shared 2023 · Discussion on HN
    6. 6
      Profiling with JVisualVM
      1 person · 2 points · first shared 2017 · Discussion on HN
    7. 7
      Using JMH with Clojure
      1 person · 2 points · first shared 2018 · Discussion on HN
    8. 8
      Clojure performance nemesis: reflection
      1 person · 2 points · first shared 2017 · Discussion on HN
    9. 9
      Clj-async-profiler 0.3.0
      1 person · 1 points · first shared 2019 · Discussion on HN
    10. 10
      Clj-async-profiler 0.4: now with flamegraph diffs
      1 person · 1 points · first shared 2019 · Discussion on HN

    What HN people wrote when they linked it

    • koito17May 2025

      Line count is not very useful to compare without the context of standard library size, third-party dependencies, etc. The code in TFA depends[1] on a JSON library[2] that is about a thousand lines of code (excluding tests) wrapping a Java library for JSON decoding.

      Then there's other things to consider, like the fact that this LSP client, while succinct, pays not only the cost of loading Jackson, but also the cost of loading clojure.core, which is quite non-trivial[3]. Startup time for LSP servers and clients definitely matters to some, considering that e.g. even clojure-lsp recommends running native executables over JAR files[4]. Can't find documentation proving it's for quick startup, but it's a plausible rationale for their recommendation of a binary over a JAR.

      Note: I have used Clojure professionally and in hobby projects. I think it's nice that one can interactively develop a minimal LSP client and the resulting amount of work is roughly 200 lines of code. I say "minimal" because it's unclear how this client deals with offsets reported by LSP servers, which are all given as offsets in a UTF-16 encoded string. In any case, I still think advertising "LSP client in 200 lines of code" hides valuable information regarding functionality, implementation, "actual" code size, and trade-offs made in the choice of technology stack.

      [1] https://github.com/vlaaad/lsp-clj-client/blob/a567e66/deps.edn

      [2] https://github.com/metosin/jsonista/blob/c8f2b62/project.clj#L20-L22

      [3]…

    • throwaway34241Dec 2019

      Based on the facts stated in the article (part 2), it looks like (years later) Java now has a new garbage collector available (ZGC, still labeled experimental, not used by default) [1]. It's an order of magnitude lower latency than current default collector, but it still has an order of magnitude higher latency target (10ms vs 1ms) than Go. I'm sure there are many good reasons for the trade offs made and that's a huge improvement, but in light of the basic numbers I'm not sure that "the Java guys are winning the low latency game" is, in fact, a fair conclusion.

      Go introduced a new GC a while back with dramatically lower latency numbers, not only compared to the previous Go GC but any other commonly available GC in any language (excluding exotic commercial ones like Azul). Neither the old or new Go GCs are particularly sophisticated compared to the highly developed ones in the Java ecosystem.

      The author of these articles seems to take objection that the latency numbers were achieved not by magic or pure GC implementation genius but by simply optimizing for latency, which involves some trade offs. I don't think this negates the usefulness of having a low latency GC available though, although I can understand how it might be frustrating to see a project getting a lot of attention for what feels like a lesser intellectual achievement.

      Obviously not all projects even require low worst-case latency, monolithic apps will be less sensitive, applications waiting on 10 other…

    • jgrodziskiAug 2023

      > - Incredibly slow

      Almost as fast as Java, and for performance critic processes 99.9% of the time we bump on infrastructure performance problem BEFORE hitting the wall with Clojure (see https://clojure-goes-fast.com/blog/ for tips and tooling about performance)

      > - Hosted on the JVM, so you're going to be dealing with Java eventually

      For me it's a major selling point: JVM is battle tested and a wonder of engineering.
      The Java ecosystem richness is incredible (see tooling above for monitoring and profiling for an example). And the platform is constantly moving forward (see latest JDK with virtual threads, generational ZGC, etc.)

      > - No automatic tail call optimization because of the limitations of the JVM, so it feels like you're writing a mess of macros rather than real functional code

      Never have been a problem and I don't see the point with macros, and code we write looks _very_ functional...

    • capablewebSep 2021

      Just to add some reference to why it can take a long time to start a REPL (for example):

      > As it turns out, Clojure start time is a complicated and multi-dimensional topic. Clojure projects are slow to start not only because of JVM — JVM itself starts in ~50 ms — but because of JVM specifics the classes are loaded slowly. Clojure projects are slow to start not only because of Clojure — Clojure itself starts in ~1 second — but because of Clojure specifics, the namespaces, especially not AOT-compiled one, are loaded slowly. And so on.

      http://clojure-goes-fast.com/blog/clojures-slow-start/

      A more recent comparison of Clojure, Java and some other Clojure-inspired languages:

      https://stuartsierra.com/2019/12/21/clojure-start-time-in-2019

    • eductionApr 2026

      Lazy sequences reduce the size of intermediate collections but they “chunk” - you get 32 items at a time, multiply that by however many transformations you have and obviously by the size of the items.

      There are some additional inefficiencies in terms of context capturing at each lazy transformation point. The problem gets worse outside of a tidy immediate set of transformations like you’ll see in any example.

      This article gives a good overview of the inefficiencies, search on “thunk” for tldr. https://clojure-goes-fast.com/blog/clojures-deadly-sin/ (I don’t agree with its near condemnation of the whole lazy pattern (laziness is quite useful - we can complain about it because we have it, it would suck if we didn’t).)

    • lilactownSep 2020

      Whenever "Clojure startup time" comes up, people are quick to point to one thing: either it's the JVM "bloat," or that it's nothing to do with the JVM and is actually all Clojure.

      Here's a pretty good (if a bit outdated) analysis on Clojure startup time: http://clojure-goes-fast.com/blog/clojures-slow-start/

      The question is, could Clojure be rewritten in a way that loads significantly faster with the same behavior on the JVM? I'm not sure.

      And especially on big projects, the lack of DCE on the JVM can lead to loading a ton of useless code that significantly impacts startup time outside of the Clojure language.

    Related

    Stuart Sierrastuartsierra.com51 people

    Clojure 2014 Year in Review

    Stuart Sierra
    Personal · last shared 2024
    Stefan Krausestefankrause.net43 people

    A first look at WebAssembly performance

    Stefan Krause
    Personal · last shared 2023
    ndk.ioblog.ndk.io19 people

    Clojure Compilation: Parenthetical Prose to Bewildering Bytecode (2014)

    ndk.io
    Personal · last shared 2024
    Alex Millerinsideclojure.org19 people

    Clojure 1.11 planning

    Alex Miller
    Personal · last shared 2024
    Inside Javainside.java66 people

    Strings Just Got Faster

    Inside Java
    Company · last shared 2026
    Best In Classbestinclass.dk46 people

    Reddit/HN clone in Clojure

    Best In Class
    Personal · last shared 2020
    Clojure Blogclojure.com31 people

    Rich Hickey: Reducers - A Library And Model For Collection Processing

    Clojure Blog
    Company · last shared 2018
    Valentin Waeselynckvvvvalvalval.github.io29 people

    What makes a good REPL?

    Valentin Waeselynck
    Personal · last shared 2025