This repository has been made to create an objective comparison of multiple frameworks that allow us to "transform" our web apps to desktop applications.
This repository was made to create an objective comparison of multiple framework that grant us to "transform" our web app to desktop application formats.
See benchmarks.json to get more informations about following data.
Note: These benchmarks are done on Github CI, there are measures to have measurements more accurates (e.g. multiple runs), but it will never exactly be accurate, as it totally depends on system load and resources. You should read these tables as comparision between frameworks on a same OS/Arch/App with a margin of error.
Some projects use the system webview, when they allocate and use the system webivew the memory is allocated by the system and so it shows up as being used by the system. It unfortunately is not actually tracked against the process. This gives you a very invalid idea of how much memory the actual process is actually using...
For example, Wails (or Tauri) might just 40m memory usage, but the system might be using another 60m of memory for the webview instance that it is managing on behalf of the Tauri/Wails app. To get the actual memory usage of these types of projects, you need to measure total system memory usage before app is ran, and then while app is being ran to see how much memory the system had to allocate for the process. Doing this either multiple times in a row or running the app multiple times at the same time can give you the approximate memory usage the system is allocating for each run of app that is using a system webview. (Please note, when checking global memory you will also need to check for additional used swap memory usage, and ignore any memory used or freed by caches)
In my tests, the majority of the memory is NOT shared between instances and is allocated per instance of the app. Even though the system is allocating the memory, it is purely for the app and is not actually shared.
One other very minor nitpick, the html used in each app (for those using a webview) should be as close to identical as possible. For example if I do <div>This is Electron</div> and do <div><p><b>This is NW.JS</b></p></div> the memory NW.JS uses in the webview will be more than Electron, because you now have three HTMLNodes having to be allocated by the webview in NW.JS vs the one in Electron. So to make things a lot closer, I would recommend that at least for your base tests, that the html displayed is as close to identical as possible to eliminate any extra css or html that has to be rendered, processed and allocated... 😀
We might need to measure between start command and a log saying something like "app started and loaded" to be more accurate.
We should be able to filter out executions that failed / crash with this system
$ npm-check
(node:8780) [DEP0128] DeprecationWarning: Invalid 'main' field in 'C:\Users\elani\AppData\Roaming\npm\node_modules\npm-check\node_modules\find-parent-dir\package.json' of 'find-parent-dir.js'. Please either fix that or report it to the module author
(Use `node --trace-deprecation ...` to show where the warning was created)
electron 😎 MAJOR UP Major update available. https://github.com/electron/electron#readme
npm install --save-dev [email protected] to go from 13.1.8 to 14.0.0
electron-packager 😍 UPDATE! Your local install is out of date. https://github.com/electron/electron-packager
npm install --save-dev [email protected] to go from 15.3.0 to 15.4.0
Even if I am a huge fan of your project, I don't think that neutralino can take only 5 Mo of memory. The Edge webview uses at least 60 Mo. Maybe I'm wrong ...
If we run the Neutralinojs in cloud mode and bind to a domain, anyone can access it as a web application. But all the native functionalities won't run purely inside the browser. So maybe we could add a small hint about this scenario into your comparison. Maybe "Partial" instead of the red icon in the "Operating System" section?
React Native is a popular cross-platform mobile frontend solution.
There have been a port for it to Windows and macOS developed by Microsoft, which fairly in active development. https://microsoft.github.io/react-native-windows/
the RAM & CPU usage of neutralinojs apps in the benchmarks only represents the main executable's resource usage, but the main executable of neutralino is only responsible for connecting the webview framework to the low level operations like file IO.
neutralino itself doesn't do any sort of rendering and executing js code, instead it uses the available webview runtime which in many cases performs worse than electron. you need to include the CPU & RAM usage of the child webview process spawned via neutralino or else it just makes no sense to include benchmark of a app which only connects the webview and low level operations.
e.g. if we only modified something in 01-empty-app, only run this one.
We still need to run every library example as we're probably gonna get another machine than the previous one, so we need to run benchmark on a compatible base.
Avalonia is yet another cross-platform GUI toolkit built on top of the Skia engine (the same engine powering Flutter) for dotnet. It targets Windows, Linux, macOS and has beta support for Android and iOS, as well as an early support to Wasm.
$ npm-check
(node:6648) [DEP0128] DeprecationWarning: Invalid 'main' field in 'C:\Users\elani\AppData\Roaming\npm\node_modules\npm-check\node_modules\find-parent-dir\package.json' of 'find-parent-dir.js'. Please either fix that or report it to the module author
(Use `node --trace-deprecation ...` to show where the warning was created)
@nodegui/nodegui 😎 NEW VER! NonSemver update available. https://github.com/nodegui/nodegui#readme
npm install --save @nodegui/[email protected] to go from 0.33.3 to 0.37.3
@nodegui/packer 😕 NOTUSED? Still using @nodegui/packer?
Depcheck did not find code similar to require('@nodegui/packer') or import from '@nodegui/packer'. Check your code before removing as depcheck isn't able to foresee all ways dependencies can be used.
Use --skip-unused to skip this check.
To remove this package: npm uninstall --save-dev @nodegui/packer
@types/node 😎 MAJOR UP Major update available. https://github.com/DefinitelyTyped/DefinitelyTyped/tree/master/types/node npm install --save-dev @types/[email protected] to go from 14.17.9 to 16.9.1
clean-webpack-plugin 😎 MAJOR UP Major update available. https://github.com/johnagan/clean-webpack-plugin
npm install --save-dev [email protected] to go from 3.0.0 to 4.0.0
ts-loader 😎 MAJOR UP Major update available. https://github.com/TypeStrong/ts-loader
npm install --save-dev [email protected] to go from 8.3.0 to 9.2.5
typescript 😍 UPDATE! Your local install is out of date. https://www.typescriptlang.org/
npm install --save-dev [email protected] to go from 4.3.5 to 4.4.3
webpack 😍 UPDATE! Your local install is out of date. https://github.com/webpack/webpack
npm install --save-dev [email protected] to go from 5.49.0 to 5.52.1
webpack-cli 😍 UPDATE! Your local install is out of date. https://github.com/webpack/webpack-cli/tree/master/packages/webpack-cli
npm install --save-dev [email protected] to go from 4.7.2 to 4.8.0
😕 NOTUSED? Still using webpack-cli?
Depcheck did not find code similar to require('webpack-cli') or import from 'webpack-cli'.
Check your code before removing as depcheck isn't able to foresee all ways dependencies can be used.
Use --skip-unused to skip this check.
To remove this package: npm uninstall --save-dev webpack-cli
Consider to add Wails to the list https://wails.io/
Build beautiful cross-platform applications using Go
How
Create similar app like Tauri
Why
Wails is a project that enables you to write desktop apps using Go and web technologies.
Consider it a lightweight and fast Electron alternative for Go. You can easily build applications with the flexibility and power of Go, combined with a rich, modern frontend.
Sciter (https://sciter.com/) is a independent, cross-platform open source webview that does not depend on the system webview and browsers.
It provides both an "embeddable" library and a runtime, optionally available as a shared library, which can greatly reduce memory usage when simultaneous applications depend on it.
Revery is a work-in-progress cross-platform UI toolkit that doesn't use native GUI library (similar to Flutter). It uses Electron under-the-hood bundled with native React/Redux-like libraries and claims to be more performant in term of CPU+RAM usages than using Electron directly.