Hacker Newsnew | past | comments | ask | show | jobs | submit | tosh's commentslogin

At least for me codex seems to write way more python than bash for general purpose stuff

nb: there is a SBCL release at end of every month: https://www.sbcl.org/all-news.html

We upgraded to 2.6.1 about a week ago and switched to using the new(ish) parallel(ish) garbage collector. I still can't tell what the impact has been.

Claude Code (which is a wizard at analyzing log files but also, I fear, an incorrigible curve-fitter) insisted that it was a real breakthrough and an excellent choice! On the other hand there was a major slowdown last night, ending in SBCL dying from heap exhaustion. I haven't had a chance to dig into that yet.


>SBCL dying from heap exhaustion

Due to hitting the cap, or to framentation? My understanding is the new parallel GC compacts the heap rather infrequently.


If by the cap you mean the heap size passed in as the --dynamic-space-size argument, it didn't hit the cap. It was using about 2/3 of that.

> My understanding is the new parallel GC compacts the heap rather infrequently

Can you explain more?


I'm going to caveat this by stating up front that obviously HN's source code is not public so I don't know what your hot path looks like, and that I'm not a domain expert on garbage collection, but I do write a fair amount of lisp for SBCL.

Immix-style collectors, like the new GC in SBCL, only compact on an opportunistic basis and so you get fragmentation pressure under load. In that situation, you might be well under the dynamic space size cap but if it can't find a large enough contiguous chunk of free heap it will still die.

So, fragmentation would be my prime suspect given what you described.


Sorry for suddenly clinging to you for support but might we be better off using the older GC in that case?

No problem. You might be better off moving back, yes.

My understanding of immix-style collection is that it divides the heap into blocks and lines. A block is only compacted/reused if every object in it is dead, and so if you mix lifetimes (i.e. lots of short-lived requests, medium-life sessions, long-life db connections/caches/interned symbols) then you tend to fill up blocks with a mix of short and long-lived objects as users log in and make requests.

When the requests get de-allocated the session remains (because the user closed the tab but didn't log out, for example, so the session is still valid) and so you end up with a bunch of blocks that are partially occupied by long-lived objects, and this is what drives fragmentation because live objects don't get moved/compacted/de-fragged very often. Eventually you fill up your entire heap with partially-allocated blocks and there is no single contiguous span of memory large enough to fit a new allocation and the allocator shits its pants.

So if that's what the HN backend looks like architecturally (mixed lifetimes), then you'd probably benefit from the old GC because when it collects, it copies all live objects into new memory and you get defragmentation "for free" as a byproduct. Obviously it's doing more writing so pauses can be more pronounced, but I feel like for a webapp that might be a good trade-off.

Alternatively you can allocate into dedicated arenas based on lifetime. That might be the best solution, at the expense of more engineering. Profiling and testing would tell you for sure.


I love HN. This is gold.


Hey, a different comment is put in highlights.

I might be wrong, but could it be that there’s an error?


Hmm let me check...

Edit: I just forgot to add it. eesh. added now thanks!


Totally. This kind of stuff is what keeps me coming back.

Hey it's totally possible that I'm actually a golden retriever who has no idea what he's talking about woof woof bark wag wag

Thank you!

You're welcome, good luck!

I have also seen some outright crashes on the new GC.

SBCL doesnt know when it's running low on available heap space? clisp uses libsigsegv, so it knows when to garbage collect really, and when it's not so needed.

Ah, the enthusiasm to please from our AI minions. :)

Thanks. Your link gives more insight into "why submit now?" Appreciate it.

gForth [0] is great for getting started

if you are working with specific hardware (e.g. microcontrollers) it depends on which forth dialects are available but for the raspberry pico and pico 2 I recently found zeptoforth [1]

or you know you can always bootstrap your own :)

[0] https://gforth.org [1] https://github.com/tabemann/zeptoforth


not the author but afaiu r3 uses the "color" concept:

tokens are tagged by type via 8bits (number literal, string, word call, word address, base word, …)

and the interpreter dispatches using these bits

it just doesn't use the colors visually in the editor and uses prefixes instead (" for string, : for code definition, ' for address of a word, …) which also means the representation in the editor matches that of the r3 source in files.


It also means people with color vision deficiencies like me don't struggle distinguishing all the hues.

taped and transcribed by Jeff Fox

https://www.ultratechnology.com/1xforth.htm



Another one to the list, however it hardly sounds like a killer application.

It's been my daily driver for close to a year now. It might not be a killer application, but it's certainly enough to prove Zig isn't vapourware.

If that is enough, there are plenty of languages around that fit the bill.

> Both of these are based on userspace stack switching, sometimes called “fibers”, “stackful coroutines”, or “green threads”.

parquet is optimized for storage and compresses well (=> smaller files)

feather is optimized for fast reading


Given the cost of storage is getting cheaper, wouldn't most firms want to use feather for analytic performance? But everyone uses parquet.


You can, still, gain a lot of performance by doing less I/O.

There's definitely a "everyone uses it because everyone uses it" effect.

Feather might be a better fit for sime yse cases, but parquet has fantastic support and is still a pretty good choice for things that feather does.

Unless they're really focussed on eaking out every bit of read performance, people often opt for the well supported path instead.


What people have done in the face of cheaper storage is store more data.

Storage is cheap but bandwidth no.

Storage getting cheaper did not really reach the cloud providers and for self-hosting it has recently gotten even more expensive due to AI bs.

And now there's Lance! https://lance.org/

Take a look at parquet.

You can also store arrow on disk but it is mainly used as in-memory representation.


Shows how much room for improvement there is on the harness level.

Agents waste a lot of tokens on editing, sandboxes, passing info back and forth from tool calls and subagents.

Love the pragmatic mix of content based addressing + line numbers. Beautiful.


Indeed. The biggest waste might be the overuse of MCP for everything. Sure it makes the initial development easier but then for every connection you're using a hundred billion dollar parameter model to decide how to make the call when it's usually completely unnecessary and then prone to random errors. MCP is the hammer that can make literally everything look like a nail...


I see this ranting against MCP all the time, and I don't get it, maybe I'm missing something. I'm currently using an MCP in Cursor to give agents read-only access to my staging and prod databases, as well as BugSnag's MCP so it can look up errors that happen in those environments. It works great. What should I be using for this if not MCP?


Make a CLI tool for it, of course


What? Why? What advantage does that have over just using an MCP server that exposes tools to run queries?

Context.

Why would I use an MCP when I can use a cli tool that the model likely trained on how to use?


Can you be more specific about “context”?

And not everything has a CLI, but in any case, the comment I was replying to was suggesting building my own CLI, which presumably the LLM wasn’t trained on.

Maybe my understanding of MCP is wrong, my assumption is that it’s a combination of a set of documented tools that the LLM can call (which return structured output), and a server that actually receives and processes those tool calls. Is that not right? What’s the downside?


agent skills, or use claude code to iteratively condense an MCP you want to use into only its most essential tools for your workflow


Agent skills are just a markdown file, what’s in that markdown file in your scenario?

And the MCP already only has the most essential tools for my workflow: the ability to run queries against a few databases.


i haven't dug into the article but your comment reminded me about the ClaudeCode Superpowers plugin. I find the plugin great but it's quite "expensive", I use the pay-as-you-go account with CC because i've just been trying it out personally and the superpowers plugin spends a lot of money, relative to regular CC, with all the back and forth.

With CC you can do a /cost to see how much your session cost in dollar terms, that's a good benchmark IMO for plugins, .md files for agents, and so on. Minimize the LLM cost in the way you'd minimize typical resource usage on a computer like cpu, ram, storage etc.


you can actually go the other way and spend more tokens to solve more complex problems (multi-agent) by letting agents work with smaller problems


Guidelines | FAQ | Lists | API | Security | Legal | Apply to YC | Contact

Search: