jumprope-rs VS jemalloc

Compare jumprope-rs vs jemalloc and see what are their differences.

InfluxDB - Power Real-Time Data Analytics at Scale
Get real-time insights from all types of time series data with InfluxDB. Ingest, query, and analyze billions of data points in real-time with unbounded cardinality.
www.influxdata.com
featured
SaaSHub - Software Alternatives and Reviews
SaaSHub helps you find the best software and product alternatives
www.saashub.com
featured
jumprope-rs jemalloc
8 34
129 9,060
- 1.0%
4.0 8.3
12 months ago 3 days ago
Rust C
GNU General Public License v3.0 or later GNU General Public License v3.0 or later
The number of mentions indicates the total number of mentions that we've tracked plus the number of user suggested alternatives.
Stars - the number of stars that a project has on GitHub. Growth - month over month growth in stars.
Activity is a relative number indicating how actively a project is being developed. Recent commits have higher weight than older ones.
For example, an activity of 9.0 indicates that a project is amongst the top 10% of the most actively developed projects that we are tracking.

jumprope-rs

Posts with mentions or reviews of jumprope-rs. We have used some of these posts to build our list of alternatives and similar projects. The last one was on 2023-10-09.
  • Text Showdown: Gap Buffers vs. Ropes
    3 projects | news.ycombinator.com | 9 Oct 2023
    Thanks for all the work in bootstrapping this part of the ecosystem! I opened an issue[1] on the memory issue for jumprope. It seems to really come down to the large size of skiplist nodes relative to the text.

    I did some testing with JumpRopeBuf, but ultimately did not include it because I was comparing things from an "interactive editor" perspective where edits are applied immediately instead of a collaborative/CRDT use case where edits are async. But it did perform very well as you said! I feel like JumpRopeBuf feels similar to a piece table, where edits are stored separately and then joined reading.

    [1] https://github.com/josephg/jumprope-rs/issues/5

  • How to Survive Your Project's First 100k Lines
    4 projects | news.ycombinator.com | 4 May 2023
    Every piece of a large program should be tested like this. And if you can, test your whole program like this too. (Doable for most libraries, databases, compilers, etc. This is much harder for graphics engines or UI code.)

    I've been doing this for years and I can't remember a single time I set something like this up and didn't find bugs. I'm constantly humbled by how effective fuzzy bois are.

    This sounds complex, but code like this will usually be much smaller and easier to maintain than a thorough unit testing suite.

    Here's an example from a rope (complex string) library I maintain. The library lets you insert or delete characters in a string at arbitrary locations. The randomizer loop is here[1]. I make Rope and a String, then in a loop make random changes and then call check() to make sure the contents match. And I check and all the expected internal invariants in the rope data structure hold:

    [1] https://github.com/josephg/jumprope-rs/blob/ae2a3f3c2bc7fc1f...

    When I first ran this test, it found a handful of bugs in my code. I also ran this same code on a few rust rope libraries in cargo, and about half of them fail this test.

  • Announcing crop, the fastest UTF-8 text rope for Rust
    9 projects | /r/rust | 26 Feb 2023
    Jumprope author here. Thanks for the quick test! I just updated the benchmarks in jumprope/rope_benches to include Crop, and it looks to me like jumprope is about 2x faster than crop:
  • Google's OSS-Fuzz expands fuzz-reward program to $30000
    3 projects | news.ycombinator.com | 2 Feb 2023
    I’d go further and say that writing most software without fuzz testing is insane. Fuzz testing is one of those things they should teach in school. They’re a super useful technique - up there with TDD and it’s a tragedy they aren’t more wildly used.

    Fuzzers are so good because they find so many bugs relative to programmer effort (lines of code). They’re some of the most efficient testing you can do. If I had to choose between a full test suite and a fuzzer, I’d choose the fuzzer.

    I use fuzzers whenever I have a self contained “machine” in my code which should have well defined behaviour. For example, a b-tree. I write little custom fuzzers each time. The fuzzing code randomly mutates the data structure and keeps a list of the expected btree content. Then periodically I verify that the list and the btree agree on what should be contained inside the list. In the project I’m working on at the moment, I have about 6 different fuzzers sprinkled throughout my testing code. (Btree fuzzer, rope fuzzer, file serialisation fuzzer, a few crdt fuzzers, and so on).

    Writing fuzzers is quite devastating for the ego. Usually the first time I point a fuzzer at my code, even when my code has a lot of tests, the fuzzer throws an assertion failure instantly. “Iteration 2 … the state doesn’t match what was expected”.

    Getting a fuzzer running all night without finding any bugs is a balm for the soul.

    The code looks like this, if anyone is curious. Here’s a fuzzer for a rope (fancy string) implementation: https://github.com/josephg/jumprope-rs/blob/master/tests/tes...

  • The case against an alternative to C
    9 projects | news.ycombinator.com | 8 Aug 2022
    Yep. A few years ago I implemented a skip list based rope library in C[1], and after learning rust I eventually ported it over[2].

    The rust implementation was much less code than the C version. It generated a bigger assembly but it ran 20% faster or so. (I don't know why it ran faster than the C version - this was before the noalias analysis was turned on in the compiler).

    Its now about 3x faster than C, thanks to some use of clever layered data structures. I could implement those optimizations in C, but I find rust easier to work with.

    C has advantages, but performance is a bad reason to choose C over rust. In my experience, the runtime bounds checks it adds are remarkably cheap from a performance perspective. And its more than offset by the extra optimizations the rust compiler can do thanks to the extra knowledge the compiler has about your program. If my experience is anything to go by, naively porting C programs to rust would result in faster code a lot of the time.

    And I find it easier to optimize rust code compared to C code, thanks to generics and the (excellent) crates ecosystem. If I was optimizing for runtime speed, I'd pick rust over C every time.

    [1] https://github.com/josephg/librope

    [2] https://github.com/josephg/jumprope-rs

  • Linked lists and Rust
    1 project | /r/rust | 7 Oct 2021
    Linked lists are also the basis for skip lists - which are awesome. One of the only data structures I know of which needs a random number generator to work correctly. I have a rope implementation that I tidied up over the last few days which uses a skip list. Its several times faster than the next fastest library I know of (ropey). They're both O(log n), but for some reason jumprope (with skip lists) still ended up several times faster than ropey's b-trees.

jemalloc

Posts with mentions or reviews of jemalloc. We have used some of these posts to build our list of alternatives and similar projects. The last one was on 2024-04-09.
  • Show HN: Comprehensive inter-process communication (IPC) toolkit in modern C++
    2 projects | news.ycombinator.com | 9 Apr 2024
    - Split-up a certain important C++ service into several parts, for various reasons, without adding latency to the request path.

    The latter task meant, among other things, communicating large amounts of user data from server application to server application. capnp-encoded structures (sometimes big - but not necessarily) would also need to be transmitted; as would FDs.

    The technical answers to these challenges are not necessarily rocket science. FDs can be transmitted via Unix domain socket as "ancillary data"; the POSIX `sendmsg()` API is hairy but usable. Small messages can be transmitted via Unix domain socket, or pipe, or POSIX MQ (etc.). Large blobs of data it would not be okay to transmit via those transports, as too much copying into and out of kernel buffers is involved and would add major latency, so we'd have to use shared memory (SHM). Certainly a hairy technology... but again, doable. And as for capnp - well - you "just" code a `MessageBuilder` implementation that allocates segments in SHM instead of regular heap like `capnp::MallocMessageBuilder` does.

    Thing is, I noticed that various parts of the company had similar needs. I've observed some variation of each of the aforementioned tasks custom-implemented - again, and again, and again. None of these implementations could really be reused anywhere else. Most of them ran into the same problems - none of which is that big a deal on its own, but together (and across projects) it more than adds up. To coders it's annoying. And to the business, it's expensive!

    Plus, at least one thing actually proved to be technically quite hard. Sharing (via SHM) a native C++ structure involving STL containers and/or raw pointers: downright tough to achieve in a general way. At least with Boost.interprocess (https://www.boost.org/doc/libs/1_84_0/doc/html/interprocess....) - which is really quite thoughtful - one can accomplish a lot... but even then, there are key limitations, in terms of safety and ease of use/reusability. (I'm being a bit vague here... trying to keep the length under control.)

    So, I decided to not just design/code an "IPC thing" for that original key C++ service I was being asked to split... but rather one that could be used as a general toolkit, for any C++ applications. Originally we named it Akamai-IPC, then renamed it Flow-IPC.

    As a result of that origin story, Flow-IPC is... hmmm... meat-and-potatoes, pragmatic. It is not a "framework." It does not replace or compete with gRPC. (It can, instead, speed RPC frameworks up by providing the zero-copy transmission substrate.) I hope that it is neither niche nor high-maintenance.

    To wit: If you merely want to send some binary-blob messages and/or FDs, it'll do that - and make it easier by letting you set-up a single session between the 2 processes, instead of making you worry about socket names and cleanup. (But, that's optional! If you simply want to set up a Unix domain socket yourself, you can.) If you want to add structured messaging, it supports Cap'n Proto - as noted - and right out of the box it'll be zero-copy end-to-end. That is, it'll do all the SHM stuff without a single `shm_open()` or `mmap()` or `ftruncate()` on your part. And if you want to customize how that all works, those layers and concepts are formally available to you. (No need to modify Flow-IPC yourself: just implement certain concepts and plug them in, at compile-time.)

    Lastly, for those who want to work with native C++ data directly in SHM, it'll simplify setup/cleanup considerably compared to what's typical. For the original Akamai service in question, we needed to use SHM as intensively as one typically uses the regular heap. So in particular Boost.interprocess's built-in 2 SHM-allocation algorithms were not sufficient. We needed something more industrial-strength. So we adapted jemalloc (https://jemalloc.net/) to work in SHM, and worked that into Flow-IPC as a standard available feature. (jemalloc powers FreeBSD and big parts of Meta.) So jemalloc's anti-fragmentation algorithms, thread caching - all that stuff - will work for our SHM allocations.

    Having accepted this basic plan - develop a reusable IPC library that handled the above oft-repeated needs - Eddy Chan joined and especially heavily contributed on the jemalloc aspects. A couple years later we had it ready for internal Akamai use. All throughout we kept it general - not Akamai-specific (and certainly not specific to that original C++ service that started it all off) - and personally I felt it was a very natural candidate for open-source.

    To my delight, once I announced it internally, the immediate reaction from higher-up was, "you should open-source it." Not only that, we were given the resources and goodwill to actually do it. I have learned that it's not easy to make something like this presentable publicly, even having developed it with that in mind. (BTW it is about 69k lines of code, 92k lines of comments, excluding the Manual.)

    So, that's what happened. We wrote a thing useful for various teams internally at Akamai - and then Akamai decided we should share it with the world. That's how open-source thrives, we figured.

    On a personal level, of course it would be gratifying if others found it useful and/or themselves contributed. What a cool feeling that would be! After working with exemplary open-source stuff like capnp, it'd be amazing to offer even a fraction of that usefulness. But, we don't gain from "market share." It really is just there to be useful. So we hope it is!

  • Finding memory leaks in Postgres C code
    1 project | news.ycombinator.com | 29 Mar 2024
    jemalloc as well has some handy leak / memory profiling abilities: https://github.com/jemalloc/jemalloc/wiki/Use-Case%3A-Heap-P...
  • Speed of Rust vs. C
    2 projects | news.ycombinator.com | 23 Feb 2024
    The worst memory performance bug I ever saw turned out to be heap fragmentation in a non-GC system. There are memory allocators that solve this like https://github.com/jemalloc/jemalloc/tree/dev but ... they do it by effectively running a GC at the block level

    As soon as you use atomic counters in a multi-threaded system you can wave goodbye to your scalability too!

  • Understanding Mesh Allocator
    2 projects | news.ycombinator.com | 26 Jan 2024
    The linked talk video mentioned they're playing with it in jemalloc and tcmalloc.

    I found this https://github.com/jemalloc/jemalloc/issues/1440 but couldn't find tcmalloc doing similar.

    These guys are aware of mesh and compare against it: https://abelay.github.io/6828seminar/papers/maas:llama.pdf

  • Atomics and Concurrency
    3 projects | news.ycombinator.com | 12 Jan 2024
    I think that the point rather was not to use any allocation in critical sections since allocator implementations are not lock-free or wait-free.

    https://github.com/jemalloc/jemalloc/blob/dev/src/mutex.c

  • Rust std:fs slower than Python
    7 projects | news.ycombinator.com | 29 Nov 2023
    Be aware `jemalloc` will make you suffer the observability issues of `MADV_FREE`. `htop` will no longer show the truth about how much memory is in use.

    * https://github.com/jemalloc/jemalloc/issues/387#issuecomment...

    * https://gitlab.haskell.org/ghc/ghc/-/issues/17411

    Apparently now `jemalloc` will call `MADV_DONTNEED` 10 seconds after `MADV_FREE`:

  • How does the OS know how much virtual memory is needed?
    1 project | /r/C_Programming | 1 Jul 2023
    jemalloc (the default FreeBSD malloc, also used by Rust) http://jemalloc.net/
  • The Overflowing Timeout Error - A Debugging Journey in Memgraph!
    1 project | dev.to | 15 Mar 2023
    Of course, we are not working on one feature at a time, we're doing things in parallel. While working on the timers, we introduced jemalloc into our codebase. After merging the jemalloc changes, tests for the timers started to fail. And what kind of failure? Segmentation faults, of course, what else...
  • Google's OSS-Fuzz expands fuzz-reward program to $30000
    3 projects | news.ycombinator.com | 2 Feb 2023
    https://github.com/jemalloc/jemalloc/issues/2222

    Strangely, these bugs were found by the CI of ClickHouse, and not by any of the hundreds of other products using these libraries.

  • My app stop working
    1 project | /r/docker | 30 Jan 2023
    2- WARNING Memory overcommit must be enabled! Without it, a background save or replication may fail under low memory condition. Being disabled, it can can also cause failures without low memory condition, see https://github.com/jemalloc/jemalloc/issues/1328. To fix this issue add 'vm.overcommit_memory = 1' to /etc/sysctl.conf and then reboot or run the command 'sysctl vm.overcommit_memory=1' for this to take effect.

What are some alternatives?

When comparing jumprope-rs and jemalloc you can also consider the following projects:

crop - 🌾 A pretty fast text rope

mimalloc - mimalloc is a compact general purpose allocator with excellent performance.

librope - UTF-8 rope library for C

tbb - oneAPI Threading Building Blocks (oneTBB) [Moved to: https://github.com/oneapi-src/oneTBB]

Odin - Odin Programming Language

rust-scudo

EmeraldC - The Ultimate C Preprocessor

rpmalloc - Public domain cross platform lock free thread caching 16-byte aligned memory allocator implemented in C

WebKit - Home of the WebKit project, the browser engine used by Safari, Mail, App Store and many other applications on macOS, iOS and Linux.

Hoard - The Hoard Memory Allocator: A Fast, Scalable, and Memory-efficient Malloc for Linux, Windows, and Mac.

buffet - All-inclusive Buffer for C

gperftools - Main gperftools repository