fasteo 5 months ago

  // voidDB is a cherished toy, a journey into the Unknown, a heroic struggle,
  // and a work of love. It is the “Twee!” of a bird; a tree falling in the
  // forest; yet another programmer pouring their drop into the proverbial [bit]
  // bucket. Above all, it is a shrine unto simple, readable, and functional
  // code; an assertion that the dichotomy between such aesthetics and practical
  // performance is mere illusion.
[1] https://github.com/voidDB/voidDB/blob/ac104867749e2c698b3d61...
  • kunley 5 months ago

    Love the poetry in the comment prose! Endeavour so much needed in the industry. It can only come out of the joy of coding, how else could it be born...

  • joel-ling 5 months ago

    Thank you for highlighting. These contain references to some philosophies I relate to and find comforting, including those most prominently articulated by Ernest Becker and Alan Watts.

  • srameshc 5 months ago

    I admire the author who took up the challenge of writing a KV DB and cherishing self's efforts. I hope someday I could do something similar and feel accomplished.

    • joel-ling 5 months ago

      Five years ago, I was new to KV DBs and Golang. You can!

binary132 5 months ago

I can’t help but think this would be more valuable as a C (or even Rust or Zig!) library with a Go API. Then it could be used elsewhere too.

joel-ling 5 months ago

Seemingly faster and more compact than lmdb-go, bbolt, Badger, and goleveldb at <2K LOC.

  goos: linux
  goarch: arm64
  pkg: github.com/voidDB/voidDB/test
  BenchmarkVoidPut-2            131072      14933 ns/op
  BenchmarkVoidGet-2            131072       1060 ns/op
  BenchmarkVoidGetNext-2        131072        245.8 ns/op
  BenchmarkLMDBPut-2            131072      22414 ns/op
  BenchmarkLMDBGet-2            131072       1826 ns/op
  BenchmarkLMDBGetNext-2        131072        602.2 ns/op
  BenchmarkBoltPut-2            131072      66984 ns/op
  BenchmarkBoltGet-2            131072       2552 ns/op
  BenchmarkBoltGetNext-2        131072        254.6 ns/op
  BenchmarkLevelPut-2           131072      44182 ns/op
  BenchmarkLevelGet-2           131072      30949 ns/op
  BenchmarkLevelGetNext-2       131072       3441 ns/op
  BenchmarkBadgerPut-2          131072      15182 ns/op
  BenchmarkBadgerGet-2          131072      33114 ns/op
  BenchmarkBadgerGetNext-2      131072      12895 ns/op
  BenchmarkNothing-2            131072          0.3239 ns/op
Check out the docs at https://pkg.go.dev/github.com/voidDB/voidDB
  • KAdot 5 months ago

    The benchmark doesn't accurately represent the real-world database performance because the dataset is too small (roughly half a gigabyte based on [1]?), meaning it fits into the page cache bypassing disk I/O.

    [1]: https://github.com/voidDB/voidDB/blob/master/test/bench_test...

    • chronode 5 months ago

      This is a cool effort but their claims are wildly misleading as their benchmarks aren't fair across the board:

      For example:

      - BenchmarkVoidPut runs a single O(n) sized transaction

      - BenchmarkLMDBPut runs a single O(n) sized transaction

      - BenchmarkBadgetPut runs O(n) O(n) sized transactions (!!!)

      I made a local change so that all Put benchmarks ran O(n) O(1) sized transactions and the results were quite different: Void was the slowest, followed by LMDB, Bold, LevelDB, then Badger.

      I'd also wager the LMDB author would also (lovingly!) tell us we're holding it wrong

      • arandomusername 5 months ago

        LMDB is the only one here in C, so the interop is probably what makes LMDB so slow in here

        • apatheticonion 5 months ago

          Curious, what overhead is there calling C code from other languages?

          • atombender 5 months ago

            Go doesn't use the C calling convention, but has its own growable stack system and goroutine scheduler that maps to goroutines to threads. So a goroutine can't just call a C function directly.

            In order to interface with C code safely, Go's runtime has to jump to the system stack and do some additional setup, make the call, and then switch back. (Adding to that, if the call takes too long, this prevents other goroutines on the same OS thread from running, so the scheduler must jump in and move those goroutines to a different thread.)

            All of this is expensive, though we are talking about nanoseconds, not milliseconds. Performance is mostly a problem when doing lots of very quick calls (e.g. you're writing a game engine interacting with something like OpenGL) or lots of slow calls (causing scheduler trashing).

            • apatheticonion 5 months ago

              Thanks! Is this also the case even Rust consumes a C library?

              • atombender 5 months ago

                No, my understanding is that Rust uses normal stacks, and it uses a classic threading model, so aside from async, calling C doesn't need to any runtime stuff.

                • steveklabnik 5 months ago

                  That is correct, and was a major motivation for dropping green threads way back in 2014.

sirjaz 5 months ago

Since there are no strict OS dependency I can see, has anyone tried to compile this and run it on Windows?

38 5 months ago
  • seanw444 5 months ago

    A lot of it is indirect dependencies, and most of the direct dependencies in the go.mod are just for benchmarks, as far as I can tell.

  • maxmcd 5 months ago

    Only "x/sys/unix" outside of tests/benchmarks

          ~/go/src/github.com/voidDB/voidDB  git:(master)
          $ go run github.com/tailscale/depaware@latest
          github.com/voidDB/voidDB dependencies: (generated by github.com/tailscale/depaware)
    
                github.com/voidDB/voidDB/common                              from github.com/voidDB/voidDB+
                github.com/voidDB/voidDB/cursor                              from github.com/voidDB/voidDB
                github.com/voidDB/voidDB/free                                from github.com/voidDB/voidDB
                github.com/voidDB/voidDB/node                                from github.com/voidDB/voidDB+
                github.com/voidDB/voidDB/reader                              from github.com/voidDB/voidDB
                golang.org/x/sys/unix                                        from github.com/voidDB/voidDB+
                bytes                                                        from github.com/voidDB/voidDB+
                cmp                                                          from internal/fmtsort+
                encoding/binary                                              from github.com/voidDB/voidDB/common+
                errors                                                       from bytes+
          D    fmt                                                          from golang.org/x/sys/unix
                hash                                                         from github.com/voidDB/voidDB+
                hash/fnv                                                     from github.com/voidDB/voidDB
                io                                                           from bytes+
                io/fs                                                        from internal/filepathlite+
                iter                                                         from reflect+
                math                                                         from encoding/binary+
                math/bits                                                    from golang.org/x/sys/unix+
                os                                                           from fmt+
                path                                                         from io/fs
                reflect                                                      from encoding/binary+
                slices                                                       from encoding/binary+
          LD    sort                                                         from golang.org/x/sys/unix
                strconv                                                      from fmt+
          LD    strings                                                      from golang.org/x/sys/unix
                sync                                                         from encoding/binary+
                sync/atomic                                                  from internal/bisect+
                syscall                                                      from github.com/voidDB/voidDB/cursor+
                time                                                         from github.com/voidDB/voidDB+
                unicode                                                      from bytes+
          W    unicode/utf16                                                from internal/poll+
                unicode/utf8                                                 from bytes+
    • joel-ling 5 months ago

      Thank you for showing substantive evidence in defence of voidDB; it is very vindicating.

      • ncruces 5 months ago

        It doesn't take much to split your go.mod file require blocks into needed dependencies, and test dependencies, with a few comments explaining the why of each dependency.

        Go tooling will preserve your go.mod comments and structure.

        You can also consider moving integration tests and benchmarks to another module in the same repo.

        • joel-ling 5 months ago

          Great ideas. I have broken out the tests into their own modules within the same repository. Thanks!

sushidev 5 months ago

Faster than rocksdb?

  • dangoodmanUT 5 months ago

    probably not if it's LMDB-based (at least for writes)

natas 5 months ago

it's screaming for a REPL...