3 ms·
Why would anyone use a NIF instead of a Port then?
by abrookewood 2y ago
Why would anyone use a NIF instead of a Port then?
- Cyph0n 2y agoIPC/shared memory overhead?
- polvalente 2y agoYeap, this is a big one. In Nx we have some facilities for doing zero-copy stuff that only really work if you have, say, Evision and EXLA running on the same OS process. We do have IPC handles that could enable this over, say, ports, but then there's a whole other discussion on pointers vs ipc handles
- toast0 2y agoNIFs are great for things that really feel like a relatively quick function call. If you've got some mathematical/crypto function, chances are you don't want that to go through a command queue to an external port, because that's too much overhead. If it's a many round crypto function like bcrypt or something, you do need to be a bit careful doing it as a NIF because of runtime. But you wouldn't want to put a sha256 through an external program and have to pass all that data to it, etc. Something that you might actually want queueing for and is likely to have potential for memory unsafety like say transcoding with ffmpeg, would be a good fit as an external Port rather than a NIF or a linked in Port driver.
- deleted 2y ago[deleted]
- ellroy 2y agoPorts are generally great, but you are running multiple apps and communicating between them using STDIN/STDOUT etc. There are certain corner cases where they might not be suitable. I had been using an OPCUA library where the logging had to be turned off because otherwise it was sending the logs back to our Elixir app and we were expecting Elixir terms. Also the shutdown of the remote end of a port can stop the data getting back to Elixir. There are ways around all of this but it's slightly annoying. In general though, ports work 80% of the time and are really convenient.