php-spx VS Vrmac

Compare php-spx vs Vrmac and see what are their differences.

Vrmac

Vrmac Graphics, a cross-platform graphics library for .NET. Supports 3D, 2D, and accelerated video playback. Works on Windows 10 and Raspberry Pi4. (by Const-me)
Our great sponsors
  • InfluxDB - Power Real-Time Data Analytics at Scale
  • WorkOS - The modern identity platform for B2B SaaS
  • SaaSHub - Software Alternatives and Reviews
php-spx Vrmac
7 45
1,873 104
- -
7.4 3.6
3 months ago over 2 years ago
C C#
GNU General Public License v3.0 only MIT License
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.

php-spx

Posts with mentions or reviews of php-spx. We have used some of these posts to build our list of alternatives and similar projects. The last one was on 2022-10-07.
  • What are modern profiling tools?
    5 projects | /r/PHP | 7 Oct 2022
    Not used it in a while, but https://github.com/NoiseByNorthwest/php-spx is worth checking out.
  • How to profile your PHP applications with Xdebug
    3 projects | news.ycombinator.com | 7 May 2022
    https://github.com/NoiseByNorthwest/php-spx

    SPX could be loaded with docker-compose like this article does for Xdebug. But if you already have a PHP environment, the easiest way to install it is to compile it (sudo apt install php-dev && make && cp modules/spx.so /usr/lib/php/....).

  • Looking for a PHP app profiler
    1 project | /r/PHPhelp | 5 Nov 2021
    php-spx
  • How to use xdebug to pinpoint PHP in a large application?
    2 projects | /r/PHPhelp | 3 Oct 2021
    Looks like, this one was not yet mentioned: you can try SPX (https://github.com/NoiseByNorthwest/php-spx)
  • Crystal Lang 1.0 Release
    16 projects | news.ycombinator.com | 22 Mar 2021
    (See also my other comment, which makes a totally different point that I decided to note separately because this got big and would have buried it)

    Well, I have ADHD. I've found the most effective approach (on top of treatment) that helps me retain focus is reexec-on-save, a la `while :; do tput clear; $thing; inotifywait -q -e moved_to .; done`. I usually have a dozen of those in old shell histories (^R FTW). (Ha, my laptop actually has exactly 12, and my other machine has 23 - although ignoredups is off...)

    $thing might be `bash ./script.sh` (because my text editor's atomic rename doesn't understand execute bits >.>), `php script.php` or `gcc -O0 script.c && ./script`. (Also, as an aside I used to use `-e close_write $file` until I realized watching even giant directories is equivalently efficient to watching a file.)

    Shell scripts (the small kind that run few subprocesses) are typically fast. Likewise, small C programs of <1000-2000 lines compile just about instantly on modern hardware; and where modern hardware isn't available and what I'm trying to do doesn't leverage too many libraries or whatnot, tcc has been able to swing the balance firmly in my favor in the past, which has been great.

    But for better or worse, PHP is currently the language I use the most. Because it's faster than Python and Ruby.

    A while back I wanted to do a bit of analysis on a dataset of information that was only published as a set of PDF documents... yayyy. But after timidly gunzipping the stream blocks and googling random bits of PDF's command language ("wat even is this"), I discovered to my complete surprise that it was trivial to interpret the text coordinate system and my first "haha let's see how bad this is" actually produced readable text on pretty much the first go. (To be pedantic, step #-1 was "draw little boxes", step #0 was "how to x,y correctly" and step #1 was "replace boxes with texWHAT it worked?!")

    With rendering basically... viable (in IIRC 300-500 LOC O.o), the next step was the boring stir-the-soup-for-8-hours bespoke state machine that cross-correlated text coordinates with field meanings ("okay, that's a heading, and the next text instruction draws the field value underneath. OK, assert that the heading is bold, the value is not, and they're both exactly the same (floating-point) Y position.")

    While that part took a while, it was mostly extremely easy, because I was pretty much linearly writing the script "from start to finish", ie just chipping away at the rock face of the task at hand until I processed an entire document, then the next document ("oh no"), then the next one ("ugh") and so forth ("wait, the edge cases are... decreasing? :D"). My workflow was pretty much founded entirely on the above-noted method.

    Loading/gunzipping a given PDF and getting to the point where the little pipeline would crash would typically complete in the span of time it would take me to release the CTRL key after hitting CTRL+S. So while the process was objectively quite like stirring soup, it did not feel like that at all and I was able to kind of float a bit as my brain cohesively absorbed the mental model of the architecture I was building without any distractions, pauses or forced context switches getting jammed in the mental encoding process like so many wrenches.

    Soon 15 documents were handled correctly, then 20, then 30, then 100 ("oooh, if all the items on the page add up exactly right it pushes line 2 of the summary heading down to the second page! Hmmm... how on earth to special-case that without refactoring to look at more than 1 page at a time..."), and then I hit some sort of threshold and it suddenly just started ticking through PDFs like crazy without asserting. Which was both awesome and a Problem™: the thing ran at something like ~60 PDFs/sec, and while jumping to just after the last successfully-processed PDF on restart worked great when the code crashed constantly, now I was sitting spinning for tens of seconds, getting distracted as I anticipated the next crash. ADHD(R)(TM).

    I wasn't surprised to learn from htop that the script was disk-bound; for some reason my ZFS mirror setup will happily read sequentially at 200MB/s, but thousands-of-tiny-files situations are... suffice to say apt unconditionally takes 60 seconds to install the smallest thing, unless the entire package db is in the FS cache. I'm not sure why. The PDFs were sharded sanely, but they were still in separate files. So I decided to pack them all into a giant blob, and since there weren't too many PDFs and they were numbered sequentially I used a simple offset-based index at the front of the blob where `fseek(data_start + ( * 4)); $o = fread(4); fseek($o);` would give me random seeking.

    Reading the blob instead promptly pegged a single CPU core (yay!), and gave me IIRC ~150+ PDFs/sec. This was awesome. But I was still just a tiny bit curious, so after googling around for a profiler and having a small jawdrop moment about SPX (https://github.com/NoiseByNorthwest/php-spx), I had a tentative look at what was actually using the most CPU (via `SPX_ENABLED=1 php ./script.php`, which will automatically print a one-page profile trace to stdout at graceful exit or ^C).

    Oh. The PDF stack machine interpreter is what's taking all the CPU time. That tiny 100 line function was the smallest in the whole script. lol

    So, I moved that function to the preprocessor/packer, then (after some headscratching) serialized the array of tokenized commands/strings into the blob by prefixing commands with \xFF and elements with \xFF\xFE\xFF so I could explode() on \xFF and tell commands from strings by checking if the previous entry was \xFE (and just skip entries of '\xFE' when I found them) :D. Then I reran the preprocessor to regenerate the pack file.

      $ php convert_dlcache.php
  • Don't blindly trust profilers
    2 projects | /r/PHP | 9 Mar 2021
    I've written a bit about this issue in php-spx's README https://github.com/NoiseByNorthwest/php-spx#notes-on-accuracy
  • A simple straight-to-the-point PHP profiling extension with its built-in web UI
    1 project | news.ycombinator.com | 4 Mar 2021

Vrmac

Posts with mentions or reviews of Vrmac. We have used some of these posts to build our list of alternatives and similar projects. The last one was on 2024-01-29.
  • New Renderers for GTK
    9 projects | news.ycombinator.com | 29 Jan 2024
    Couple times in the past I have implemented GPU-targeted GUI renderers, here’s an example: https://github.com/Const-me/Vrmac?tab=readme-ov-file#vector-... https://github.com/Const-me/Vrmac/blob/master/Vrmac/Draw/VAA...

    2D graphics have very little in common with game engines. The problem is very different in many regards. In 2D, you generally have Bezier and other splines on input, large amount of overdraw, textures coming from users complicate VRAM memory management. OTOH, game engines are solving hard problem which are irrelevant to 2D renderers, like dynamic lighting, volumetric effects, and dynamic environment.

  • Was Rust Worth It?
    18 projects | news.ycombinator.com | 25 Oct 2023
    > Part of Panama

    Most real-live C APIs are using function pointers and/or complicated data structures. Here’s couple real-life examples defined by Linux kernel developers who made V4L2 API: [0], [1] The first of them contains a union in C version, i.e. different structures are at the same memory addresses. Note C# delivers the level of usability similar to C or C++: we simply define structures, and access these fields. Not sure this is gonna be easy in Java even after all these proposals arrive.

    For a managed runtime, unmanaged interop is a huge feature which affects all levels of the stack: type system in the language for value types, GC to be able to temporarily pin objects passed to native code (making copies is prohibitively slow for use cases like video processing), code generator to convert managed delegates to C function pointers and vice versa, error handling to automatically convert between exceptions and integer status codes at the API boundary, and more. Gonna be very hard to add into the existing language like Java.

    > "Vector API" JEP

    That API is not good. They don’t expose hardware instructions, instead they have invented some platform-agnostic API and implemented graceful degradation.

    This means the applicability is likely to be limited to pure vertical operations processing FP32 or FP64 numbers. The rest of the SIMD instructions are too different between architectures. A simple example in C++ is [2], see [3] for the context. That example is trivial to port to modern C#, but impossible to port to Java even after the proposed changes. The key part of the implementation is psadbw instruction, which is very specific to SSE2/AVX2 and these vector APIs don’t have an equivalent. Apart from reduction, other problematic operations are shuffles, saturating integer math, and some memory access patterns (gathers in AVX2, transposed loads/stores on NEON).

    > most of these are not done / not in a stable LTS Java release yet

    BTW, SIMD intrinsics arrived to C# in 2019 (.NET Core 3.0 released in 2019), and unmanaged interop support is available since the very first 1.0 version.

    [0] https://github.com/Const-me/Vrmac/blob/master/VrmacVideo/Lin...

    [1] https://github.com/Const-me/Vrmac/blob/master/VrmacVideo/Lin...

    [2] https://gist.github.com/Const-me/3ade77faad47f0fbb0538965ae7...

    [3] https://news.ycombinator.com/item?id=36618344

  • Stable Diffusion in pure C/C++
    8 projects | news.ycombinator.com | 19 Aug 2023
    I have minimal experience with Rust. OTOH, programming C++ for living since 2000, with a few gaps when I used other languages like Obj-C and C#.

    I agree C++ is very hard to learn if you only have experience with higher-level languages like Python and Scala. I think there’re two reasons for that.

    C++ is unsafe. There’s no way around this one, it was designed that way, like C or assembly. Still, with modern toolset it’s not terribly bad. Compilers print warnings, BTW I typically ask them to treat warnings as errors to deliberately fail the build. On Windows, a combination of debug build, debug C runtime, and visual studio debugger helps tremendously. Linux compilers have these sanitizers (address, memory, thread, undefined behavior) which are comparable, they too sacrifice runtime speed for diagnostics and debuggability.

    Another reason, the language itself is very complicated, especially the templates. However, just because something is in the language doesn’t mean it’s a good idea to use it. You don’t need to be familiar with that stuff unless doing something very advanced, like customizing the Eigen C++ library. Don’t follow the patterns found in the standard library: unlike your code, that library has good reasons to use that template BS. If instead of templates you do something else, C++ becomes much easier to use, and most importantly other people will still be able to read and understand your code. Another reason to avoid excessive template metaprogramming, it slows down the compiler, because template-heavy code often needs to be in headers as opposed to cpp files.

    P.S. If you don’t need extreme levels of performance (defined as “approach the numbers listed in CPU specs”, the numbers are FLOPS or memory bandwidth), and you don’t need the ecosystem too much, consider C# instead of C++. Much faster than Python, often faster than Scala or Java, easy integration with C should you need that (same as Rust, much easier than Python or Java), the only downside is these ~100MB of the runtime. The reputation is weird, but technically the language and runtime are pretty good. For example, here’s a C# library which re-implements a subset of ffmpeg and libavcodec C libraries: https://github.com/Const-me/Vrmac/tree/master/VrmacVideo

  • Media Player Element now available for cross-platform apps everywhere dotnet runs
    2 projects | /r/dotnet | 6 Jun 2023
    BTW, I did that too for 32-bit ARM Linux on Raspberry Pi 4, back in 2020: https://github.com/Const-me/Vrmac/tree/master/VrmacVideo Unlike Uno, my implementation doesn’t use libVLC and is written mostly in C#, only audio decoders are in C++. To decode video, I directly consume V4L2 Linux kernel APIs.
  • Ask HN: Those making $0/month or less on side projects – Show and tell
    95 projects | news.ycombinator.com | 27 Jan 2023
    Doing that for decades.

    An app for Windows phone, downloaded 140k times: https://github.com/Const-me/SkyFM

    Cross-platform graphics library for .NET: https://github.com/Const-me/Vrmac

    Recently, offline speech-to-text for Windows: https://github.com/Const-me/Whisper

    At this point, I consider side projects like that as a hobby.

  • Minimal Cross-Platform Graphics
    11 projects | news.ycombinator.com | 24 Jan 2023
    I think this needs much more complexity to be useful.

    For the rendering, ideally it needs GPU support.

    Input needs much more work, here's an overview for Windows: https://zserge.com/posts/fenster/

    Windows' Sleep() function has default resolution 15.6ms, that's not enough for realtime rendering, and relatively hard to fix, ideally need a modern OS and a waitable timer created with high resolution flag.

    Here's my attempt at making something similar, couple years ago: https://github.com/Const-me/Vrmac

  • An MP4 file first draft
    7 projects | news.ycombinator.com | 26 Nov 2022
  • Cppfront, Herb Sutter's proposal for a new C++ syntax
    13 projects | news.ycombinator.com | 17 Sep 2022
    I agree about Python or PHP.

    However, for Java or modern C#, in my experience the performance is often fairly close. When using either of them, very often one doesn’t need C++ to be good enough.

    Here’s an example, a video player library for Raspberry Pi4: https://github.com/Const-me/Vrmac/tree/master/VrmacVideo As written on that page, just a few things are in C++ (GLES integration, audio decoders, and couple SIMD utility functions), the majority of things are in C#.

  • Vulkan update: version 1.2 conformance for Raspberry Pi 4
    7 projects | news.ycombinator.com | 3 Aug 2022
    To be fair, in modern GL versions they fixed some of these things. In GLES 3.1 which I used a lot on Pi4 https://github.com/Const-me/Vrmac/ GPU vertex buffers and shaders worked fine, GLSL compiler in the drivers worked fine too.

    However, others issues are still present. There’s no shaders bytecode, they have an extension to grab compiled shaders from GPU driver to cache on disk, but it doesn’t work. The only way to create shaders is separate compile and link API calls. Texture loading and binding API is still less than ideal.

  • Advice for the next dozen Rust GUIs
    14 projects | news.ycombinator.com | 15 Jul 2022

What are some alternatives?

When comparing php-spx and Vrmac you can also consider the following projects:

PHPSpy - low-overhead sampling profiler for PHP 7+

neutralinojs - Portable and lightweight cross-platform desktop application development framework

development - Docker based local development environment

nanovg - Antialiased 2D vector drawing library on top of OpenGL for UI and visualizations.

php-memory-profiler - Memory profiler for PHP. Helps finding memory leaks in PHP scripts.

vello - An experimental GPU compute-centric 2D renderer.

clockwork - Clockwork - php dev tools in your browser - server-side component

rapidyaml - Rapid YAML - a library to parse and emit YAML, and do it fast.

coz - Coz: Causal Profiling

sokol - minimal cross-platform standalone C headers

msgpack.php - A pure PHP implementation of the MessagePack serialization format / msgpack.org[PHP]

NanoGUI - Minimalistic GUI library for OpenGL