Todd Sundsted
Todd Sundsted
toddsundsted@epiktistes.com
Better dead than bored.
Introductionepiktistes.com/introduction
GitHubgithub.com/toddsundsted/ktistec
Pronounshe/him
馃寧Sector 001
Todd Sundsted

i'm getting some clicking noise from the 3d printer. probably time to read the manual...

#3dprinting

Todd Sundsted
manhattanhenge looking west along 14th street, at ave c

i caught the last minutes of #manhattanhenge tonight while walking doggo...

Todd Sundsted
NYC, East Village, Floodgate 13, M-E70-013

there's something vaguely apocalyptic about the floodgates being installed around manhattan.

#nyc

Todd Sundsted

i was trying to guess at the wire format of sse (server sent events) by reading the hotwired turbo and turbo-rails code, and was getting nowhere quickly. then i thought... why not read the specification... and it was right there...

#seriously #rtfs

Todd SundstedCrystalLanguage

Do you know why LavinMQ can handle so many connections and process that many messages?

There are several reasons, but one of them is because developers can understand the library code the application runs.
crystal-lang.org/2024/05/22/la

#performance #crystallang #lavinmq #programming

Todd Sundsted
Avenue C, Friday Night, NYC
Todd Sundsted

i've been working and wearing my nreal/xreal air glasses on this flight.

it's a trip when the plane is banking and turning. i also have a virtual ultrawide screen. i'm sure the guy next to me wonders what i'm studying over there...

Todd Sundsted

many, many languages show up in my fediverse timeline. firefox translate selection (browser.translations.select.enable) appears to be what i need, but its language support seems limited.

#firefox #translation

Todd Sundsted

When you optimize a Crystal program, pay attention to language features that inline code. For example, pay attention to how you use blocks (consequences here and here).

Also pay attention to how you use macros. Macros, like ECR.embed and Slang.embed, inline code at the point where they are invoked. This can be powerful, because macros actually generate code鈥攂ut, ten invocations later, you have ten copies of the code.

Here's a case of too many copies, but with a very happy ending...

Ktistec uses both ECR.embed and Slang.embed to generate web pages from views and partials. I wrote code to count the number of places Ktistec used embed for each view and partial it renders. There's a long tail, but here are the big ones:

| src/views/layouts/default.html.ecr           | 204 |
| src/views/partials/modals.html.slang         | 204 |
| src/views/partials/header.html.slang         | 204 |
| src/views/partials/footer.html.slang         | 204 |
| src/views/pages/generic.html.slang           | 155 |
| src/views/partials/object/label.html.slang   |  36 |
| src/views/partials/object/content.html.slang |  36 |
| src/views/partials/collection.json.ecr       |  28 |
| src/views/partials/thread.html.slang         |  12 |
| src/views/partials/detail.html.slang         |  12 |
| src/views/partials/object.html.slang         |  12 |
| src/views/partials/actor-panel.html.slang    |  11 |
| src/views/partials/object.json.ecr           |  11 |
| src/views/partials/paginator.html.slang      |  11 |
| src/views/objects/thread.json.ecr            |   8 |
| src/views/partials/activity/label.html.slang |   6 |
| src/views/mentions/index.json.ecr            |   6 |
| src/views/remote_follows/index.json.ecr      |   6 |
| src/views/settings/settings.json.ecr         |   6 |
| src/views/tags/index.json.ecr                |   6 |
| src/views/activities/activity.json.ecr       |   5 |
| src/views/partials/editor.html.slang         |   5 |
| src/views/objects/object.json.ecr            |   5 |
| src/views/actors/remote.json.ecr             |   4 |
...

The layout is part of every page and is rendered with every view, so lots of copies. Every page has a header and a footer (and some default modal dialogs) so you get those, too. The generic view is a little less obvious. It's used to render pages for which there is no more specific view鈥攖ypically pages served for 400 Bad Request or 401 Unauthorized. Objects (posts) are rendered in a variety of contexts, so it's no surprise label.html.slang and content.html.slang are popular.

ECR.embed and Slang.embed inline templates at the point where they are invoked, but beyond that they don't really customize the generated code鈥攖hey just duplicate it. What we want聽 is one function for each view or partial, which wraps embed and returns JSON or HTML.

Those changes mostly occur in commits from 399287cf to 4b025f50. To say that they made a huge difference is a gross understatement. Executable size decreased by ~13%. Build time decreased by ~50%, and the memory required to build decreased by ~30%.

#ktistec #crystallang #optimization

Todd SundstedJamie Gaskins

One of my favorite threads on the Crystal language forum right now is comparing compilation performance. So far, the Macs are winning.

forum.crystal-lang.org/t/cpu-c #crystal