Compare commits

..

7 commits

Author SHA1 Message Date
17152f9d14
include comperative benchmarking results
Some checks are pending
Rust / build (push) Waiting to run
2024-08-05 03:57:43 +03:00
52d9a479cf
additional nix tooling 2024-08-05 03:48:51 +03:00
1ced9b4527
increment cargo version 2024-08-05 02:19:19 +03:00
7de3f27642
nix: build with llvm.stdenv; use mold linker 2024-08-05 02:04:23 +03:00
5c335d179e
isolate build profiles; optimize dev 2024-08-05 02:02:58 +03:00
7bed1f583b
use color_eyre::Result in most functions 2024-08-05 01:37:32 +03:00
0fb8fbaae6
receive uptime from nix crate 2024-08-05 01:37:13 +03:00
11 changed files with 98 additions and 32 deletions

5
.envrc Normal file
View file

@ -0,0 +1,5 @@
watch_file flake.nix
watch_file flake.lock
watch_dir nix
use flake

2
Cargo.lock generated
View file

@ -105,7 +105,7 @@ checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3"
[[package]] [[package]]
name = "microfetch" name = "microfetch"
version = "0.3.2" version = "0.3.3"
dependencies = [ dependencies = [
"color-eyre", "color-eyre",
"nix", "nix",

View file

@ -1,15 +1,24 @@
[package] [package]
name = "microfetch" name = "microfetch"
version = "0.3.2" version = "0.3.3"
edition = "2021" edition = "2021"
[dependencies] [dependencies]
nix = {version = "0.29", features = ["fs", "hostname"]} nix = {version = "0.29", features = ["fs", "hostname"]}
color-eyre = { version = "0.6", default-features = false } color-eyre = { version = "0.6", default-features = false }
[profile.dev]
opt-level = 3
[profile.release] [profile.release]
strip = true strip = true
opt-level = "z" opt-level = "z"
lto = true lto = true
codegen-units = 1 codegen-units = 1
panic = "abort" panic = "abort"
[profile.profiler]
inherits = "release"
debug = true
split-debuginfo = "unpacked"
strip = "none"

View file

@ -1,11 +1,25 @@
# Microfetch <div align="center">
<img src="https://deps.rs/repo/github/notashelf/microfetch/status.svg" alt="https://deps.rs/repo/github/notashelf/microfetch">
<!-- <img src="https://img.shields.io/github/v/release/notashelf/microfetch?display_name=tag&color=DEA584"> -->
<img src="https://img.shields.io/github/stars/notashelf/microfetch?label=stars&color=DEA584">
</div>
A stupidly simple fetch tool, written in Rust. Runs in a fraction of a second, <h1 align="center">Microfetch</h1>
displays most nonsense people on r/unixporn care about. Aims to replace
fastfetch on my system, but probably not on yours. Though you are more than
welcome to use it on your system: it's fast.
![Demo](.github/assets/demo.png) Stupidly simple, laughably fast fetch tool. Written in Rust for speed and ease
of maintainability. Runs in a _fraction of a millisecond_ and displays _most_ of
the nonsense you'd see posted on r/unixporn or other internet communities. Aims
to replace [fastfetch](https://github.com/fastfetch-cli/fastfetch) on my
personal system, but [probably not yours](#customizing). Though, you are more
than welcome to use it on your system: it's pretty [fast...](#benchmarks)
<p align="center">
<img
alt="latest demo"
src="./.github/assets/demo.png"
width="850px"
>
</p>
## Features ## Features
@ -20,7 +34,7 @@ welcome to use it on your system: it's fast.
- Name - Name
- Version - Version
- Architecture - Architecture
- Current shell (from $SHELL) - Current shell (from $SHELL, trimmed if store path)
- WM/Compositor and display backend - WM/Compositor and display backend
- Memory Usage/Total Memory - Memory Usage/Total Memory
- Storage Usage/Total Storage (for `/` only) - Storage Usage/Total Storage (for `/` only)
@ -33,12 +47,17 @@ Microfetch's performance is mostly hardware-dependant, however, the overall
trend seems to be < 2ms on any modern (2015 and after) CPU. Below are the trend seems to be < 2ms on any modern (2015 and after) CPU. Below are the
benchmarks with Hyperfine on my desktop system. benchmarks with Hyperfine on my desktop system.
| Command | Mean [ms] | Min [ms] | Max [ms] | Relative | | Command | Mean [ms] | Min [ms] | Max [ms] | Relative |
| :-------------------------- | --------: | -------: | -------: | -------: | | :----------- | ----------: | -------: | -------: | -------------: |
| `target/release/microfetch` | 1.3 ± 0.1 | 1.2 | 3.7 | 1.00 | | `microfetch` | 1.3 ± 0.0 | 1.3 | 1.4 | 1.00 |
| `pfetch` | 254.2 ± 4.8 | 246.7 | 264.9 | 191.97 ± 7.10 |
| `neofetch` | 735.4 ± 9.5 | 721.1 | 752.8 | 555.48 ± 19.08 |
| `fastfetch` | 31.9 ± 0.8 | 30.8 | 33.8 | 24.08 ± 0.98 |
On an average configuration, this is roughly 25 times faster than fastfetch and _As far as I'm concerned, Microfetch is faster than almost every fetch tool
around 80 times faster than neofetch. Results, as stated above, may vary. there is. The only downside of using Rust is introducing more "bloated"
dependency trees and increasing build times. The latter is easily mitigated with
Nix's binary cache, though._
## Customizing ## Customizing
@ -64,6 +83,14 @@ general rule of thumb consider talking to me before creating a feature PR.
Contributions that help improve performance in specific areas of Microfetch are Contributions that help improve performance in specific areas of Microfetch are
welcome. Though, prepare to be bombarded with questions. welcome. Though, prepare to be bombarded with questions.
## Hacking
A Nix flake is provided. `nix develop` to get started. Direnv users may simply
run `direnv allow` to get started.
Non-nix users will need `cargo` and `gcc` installed on their system, see
`Cargo.toml` for available release profiles.
## License ## License
Microfetch is licensed under [GPL3](LICENSE). See the license file for details. Microfetch is licensed under [GPL3](LICENSE). See the license file for details.

View file

@ -13,5 +13,9 @@
packages = forEachSystem (system: { packages = forEachSystem (system: {
default = pkgsForEach.${system}.callPackage ./nix/package.nix {}; default = pkgsForEach.${system}.callPackage ./nix/package.nix {};
}); });
devShells = forEachSystem (system: {
default = pkgsForEach.${system}.callPackage ./nix/shell.nix {};
});
}; };
} }

View file

@ -1,17 +1,21 @@
{ {
lib, lib,
rustPlatform, rustPlatform,
stdenvAdapters,
llvm,
}: let }: let
toml = (lib.importTOML ../Cargo.toml).package; toml = (lib.importTOML ../Cargo.toml).package;
pname = toml.name; pname = toml.name;
inherit (toml) version; inherit (toml) version;
in in
rustPlatform.buildRustPackage { rustPlatform.buildRustPackage.override {stdenv = stdenvAdapters.useMoldLinker llvm.stdenv;} {
RUSTFLAGS = "-C link-arg=-fuse-ld=mold";
inherit pname version; inherit pname version;
src = builtins.path { src = builtins.path {
name = "${pname}-${version}"; name = "${pname}-${version}";
path = ../.; path = lib.sources.cleanSource ../.;
}; };
cargoLock.lockFile = ../Cargo.lock; cargoLock.lockFile = ../Cargo.lock;

25
nix/shell.nix Normal file
View file

@ -0,0 +1,25 @@
{
mkShell,
rust-analyzer-unwrapped,
rustfmt,
clippy,
cargo,
rustc,
gcc,
rustPlatform,
}:
mkShell {
strictDeps = true;
nativeBuildInputs = [
cargo
rustc
gcc
rust-analyzer-unwrapped
rustfmt
clippy
];
env.RUST_SRC_PATH = "${rustPlatform.rustLibSrc}";
}

View file

@ -1,3 +1,4 @@
use color_eyre::Result;
use std::{env, io}; use std::{env, io};
pub fn get_desktop_info() -> Result<String, io::Error> { pub fn get_desktop_info() -> Result<String, io::Error> {

View file

@ -9,6 +9,7 @@ use crate::desktop::get_desktop_info;
use crate::release::{get_os_pretty_name, get_system_info}; use crate::release::{get_os_pretty_name, get_system_info};
use crate::system::{get_memory_usage, get_root_disk_usage, get_shell, get_username_and_hostname}; use crate::system::{get_memory_usage, get_root_disk_usage, get_shell, get_username_and_hostname};
use crate::uptime::get_current; use crate::uptime::get_current;
use color_eyre::Report; use color_eyre::Report;
use nix::sys::sysinfo::sysinfo; use nix::sys::sysinfo::sysinfo;

View file

@ -1,3 +1,4 @@
use color_eyre::Result;
use nix::sys::statvfs::statvfs; use nix::sys::statvfs::statvfs;
use nix::sys::sysinfo::SysInfo; use nix::sys::sysinfo::SysInfo;

View file

@ -1,21 +1,10 @@
use std::fs::File; use color_eyre::Result;
use std::io::{self, BufRead, BufReader}; use nix::sys::sysinfo::sysinfo;
use std::path::Path; use std::io;
pub fn get_current() -> Result<String, io::Error> { pub fn get_current() -> Result<String, io::Error> {
let path = Path::new("/proc/uptime"); let info = sysinfo().map_err(|e| io::Error::new(io::ErrorKind::Other, e))?;
let file = File::open(path)?; let uptime_seconds = info.uptime().as_secs_f64();
let mut reader = BufReader::new(file);
let mut line = String::new();
reader.read_line(&mut line)?;
let uptime_seconds: f64 = line
.split_whitespace()
.next()
.ok_or_else(|| io::Error::new(io::ErrorKind::Other, "Failed to parse uptime"))?
.parse()
.map_err(|e| io::Error::new(io::ErrorKind::InvalidData, e))?;
let total_minutes = (uptime_seconds / 60.0).round() as u64; let total_minutes = (uptime_seconds / 60.0).round() as u64;
let days = total_minutes / (60 * 24); let days = total_minutes / (60 * 24);