Giter VIP home page Giter VIP logo

Comments (8)

michalmuskala avatar michalmuskala commented on August 14, 2024 1

The easiest way would be to maintain the parsing stack as a data structure threaded through the functions instead of using recursive calls - this means we can always interrupt, return from the functions, yield and later use that state to resume the parsing from where it was left.

from jason.

selfup avatar selfup commented on August 14, 2024

I think this is a great idea!

Having multiple Rust binaries for popular targets will be nice as well as using Rustler.

We could also just provide some sort of build step for those comfortable in the Rust ecosystem as well.

Now that serde is on stable we can (with confidence) push out stable/safe native perf for those that chose the alternative

from jason.

michalmuskala avatar michalmuskala commented on August 14, 2024

Yes, but we can't use serde directly - the problem is that it is not pre-emptive, so we can't use it with regular NIFs. It's true we have dirty schedulers, but I'm pretty sure using them in high concurrency situations for this could be even slower than the pure Elixir version (that statement is not confirmed by any experiments, though).

from jason.

selfup avatar selfup commented on August 14, 2024

Yea that makes sense. I wonder how this could otherwise be done 🤔

from jason.

RumataEstor avatar RumataEstor commented on August 14, 2024

@michalmuskala

Yes, but we can't use serde directly - the problem is that it is not pre-emptive

This is a bit unexpected especially as Rust is meant to be highly concurrent and I can't find a proof that serde is not thread safe.

from jason.

ericmj avatar ericmj commented on August 14, 2024

@RumataEstor It's not about thread safety. Rust and Elixir does concurrency in different ways, Rust uses OS threads and Elixir uses lightweight processes. When serde runs it will block a scheduler until it is done running so when decoding or encoding large JSON objects you can disrupt the scheduler.

from jason.

michalmuskala avatar michalmuskala commented on August 14, 2024

I don’t mean it’s not thread safe - it is. Preemptive means we need to be able to pause the execution of the parser/generator at arbitrary moments to yield the scheduler thread to other elixir/erlang processes.

from jason.

michalmuskala avatar michalmuskala commented on August 14, 2024

After 5 years, I finally got around to this. Check out https://github.com/spawnfest/json_native!

from jason.

Related Issues (20)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.