| ▲ | Show HN: Elysia JIT "Compiler", why it's one of the fastest JavaScript framework(elysiajs.com) | |||||||
| 44 points by saltyaom 2 days ago | 10 comments | ||||||||
Wrote a thing about what makes Elysia stand out in a performance benchmark game Basically, there's a JIT "compiler" embedded into a framework This approach has been used by ajv and TypeBox before for input validation, making it faster than other competitors Elysia basically does the same, but scales that into a full backend framework This gave Elysia an unfair advantage in the performance game, making Elysia the fastest framework on Bun runtime, but also faster than most on Node, Deno, and Cloudflare Worker as well, when using the same underlying HTTP adapter There is an escape hatch if necessary, but for the past 3 years, there have been no critical reports about the JIT "compiler" What do you think? | ||||||||
| ▲ | codingdave 5 hours ago | parent | next [-] | |||||||
Sounds plausible, but the article itself lists a number of downsides to this, including a statement about potential security problems with a somewhat wishy washy "The input is almost never user-controlled". That "almost never" is a big red flag to me - sounds like there are known security holes that are being glossed over. So my question is whether there are any real-world scenarios where the performance gains will make a difference to the end customer? Because if not, this framework would bring on the known downsides without a compelling reason for doing so aside from bragging rights of "we're the fastest" | ||||||||
| ▲ | hueho 3 hours ago | parent | prev | next [-] | |||||||
> Sucrose looks at code and tells the "compiler" to only parse params and skip parsing other parts of the request like body, query, headers entirely as it's not need. My understanding is that just offering a request object with lazy accessors would solve this issue, although the accessor itself would have some overhead in repeat accesses. > Elysia has two special optimizations for response mapping functions: mapResponse and mapCompactResponse. This section feels a bit abstract - some transformation examples would be nice. | ||||||||
| ||||||||
| ▲ | g947o 5 hours ago | parent | prev | next [-] | |||||||
> Sucrose read the code without executing it by using Function.toString() then perform our own custom pattern-matching to extract useful information about what parts of the request are actually needed by the route handler. Hmm. | ||||||||
| ||||||||
| ▲ | vmsp 2 hours ago | parent | prev | next [-] | |||||||
Is doing stuff like constant folding pre-execution really worth it? I mean, won't the engine itself (V8, JSC, MozJS) be doing it anyway? I know that Google's Closure Compiler — probably still the most advanced JS optimized — also does it but I can't help but think it's probably pointless. | ||||||||
| ||||||||
| ▲ | Lerc 4 hours ago | parent | prev | next [-] | |||||||
I was really confused about what a JIT "Compiler" for a JavaScript framework means, but it turns out it means something like I've done myself. My site https://c50.fingswotidun.com/ uses the same trick to generate code for the image generation. Between the confusion of what Compile, JIT, Engine, Runtime, and FrameWork is (which I blame Bun a little bit for starting this entire Runtime/Engine confusion). I think we might need some new terminology to describe this method. Maybe a made-up word is needed, JIT was good in that an acronym with a vowel made it wordable and specific. | ||||||||
| ▲ | bennett_dev 3 hours ago | parent | prev | next [-] | |||||||
I'm not familiar with Elysia but how does this handle subfunctions? e.g. if my code is const app = new Elysia() .patch('/user/:id', (request) => { return handleUserRequest(request); }) or some other custom logic, does it automatically need to fall back to full parsing? | ||||||||
| ▲ | NuclearPM 4 hours ago | parent | prev [-] | |||||||
Frameworks. Plural. | ||||||||