commit 9aec2633bffce9944bb9647b58abe5072e5834a8
parent e36b0a81145b163bdf103d43e31392b272417cbe
Author: Jared Tobin <jared@jtobin.io>
Date: Mon, 22 Dec 2025 20:02:06 -0330
meta: add llvm flag
Diffstat:
4 files changed, 42 insertions(+), 21 deletions(-)
diff --git a/README.md b/README.md
@@ -50,30 +50,34 @@ Current benchmark figures on a M4 Silicon MacBook Air look like (use
```
benchmarking ppad-base58/base58/encode/hello world
- time 356.9 ns (355.7 ns .. 359.2 ns)
- 1.000 R² (1.000 R² .. 1.000 R²)
- mean 357.4 ns (356.7 ns .. 359.4 ns)
- std dev 3.439 ns (1.609 ns .. 6.911 ns)
+ time 350.3 ns (349.2 ns .. 352.0 ns)
+ 0.999 R² (0.997 R² .. 1.000 R²)
+ mean 353.0 ns (351.9 ns .. 354.9 ns)
+ std dev 4.705 ns (3.411 ns .. 7.449 ns)
+ variance introduced by outliers: 13% (moderately inflated)
benchmarking ppad-base58/base58/decode/StV1DL6CwTryKyV
- time 397.7 ns (397.2 ns .. 398.1 ns)
- 1.000 R² (1.000 R² .. 1.000 R²)
- mean 397.3 ns (397.1 ns .. 397.6 ns)
- std dev 942.3 ps (752.8 ps .. 1.232 ns)
+ time 377.7 ns (373.7 ns .. 380.7 ns)
+ 0.999 R² (0.999 R² .. 1.000 R²)
+ mean 379.4 ns (376.8 ns .. 381.8 ns)
+ std dev 9.020 ns (7.823 ns .. 10.76 ns)
+ variance introduced by outliers: 32% (moderately inflated)
benchmarking ppad-base58/base58check/encode/0x00, hello world
- time 2.430 μs (2.428 μs .. 2.431 μs)
+ time 1.197 μs (1.195 μs .. 1.200 μs)
1.000 R² (1.000 R² .. 1.000 R²)
- mean 2.433 μs (2.432 μs .. 2.434 μs)
- std dev 4.715 ns (3.868 ns .. 5.971 ns)
+ mean 1.200 μs (1.198 μs .. 1.202 μs)
+ std dev 7.256 ns (6.187 ns .. 8.819 ns)
benchmarking ppad-base58/base58check/decode/13vQB7B6MrGQZaxCqW9KER
- time 2.500 μs (2.497 μs .. 2.504 μs)
+ time 1.222 μs (1.218 μs .. 1.225 μs)
1.000 R² (1.000 R² .. 1.000 R²)
- mean 2.506 μs (2.503 μs .. 2.510 μs)
- std dev 9.919 ns (7.444 ns .. 14.66 ns)
+ mean 1.220 μs (1.217 μs .. 1.223 μs)
+ std dev 9.566 ns (8.250 ns .. 11.28 ns)
```
+You should build with the 'llvm' flag for maximum performance.
+
## Security
This library aims at the maximum security achievable in a
diff --git a/flake.lock b/flake.lock
@@ -97,16 +97,19 @@
"ppad-nixpkgs",
"nixpkgs"
],
+ "ppad-base16": [
+ "ppad-base16"
+ ],
"ppad-nixpkgs": [
"ppad-nixpkgs"
]
},
"locked": {
- "lastModified": 1740802974,
- "narHash": "sha256-GTD9UrxwMa5zY7hxzDSXjKXKUwMK4r3FBHLG0nvgapk=",
+ "lastModified": 1766435555,
+ "narHash": "sha256-ysN0iRuBLSQrgWU3rCFUyq0NvRpug6DTBRZSlWbmI1A=",
"ref": "master",
- "rev": "ab0957e305dff0243dcab11e381470585849fd20",
- "revCount": 94,
+ "rev": "a4c17689cd66e1ef35c667914765cb24c9a4b305",
+ "revCount": 96,
"type": "git",
"url": "git://git.ppad.tech/sha256.git"
},
diff --git a/flake.nix b/flake.nix
@@ -17,6 +17,7 @@
type = "git";
url = "git://git.ppad.tech/sha256.git";
ref = "master";
+ inputs.ppad-base16.follows = "ppad-base16";
inputs.ppad-nixpkgs.follows = "ppad-nixpkgs";
};
flake-utils.follows = "ppad-nixpkgs/flake-utils";
@@ -32,13 +33,19 @@
pkgs = import nixpkgs { inherit system; };
hlib = pkgs.haskell.lib;
+ llvm = pkgs.llvmPackages_15.llvm;
base16 = ppad-base16.packages.${system}.default;
+
sha256 = ppad-sha256.packages.${system}.default;
+ sha256-llvm =
+ hlib.addBuildTools
+ (hlib.enableCabalFlag sha256 "llvm")
+ [ llvm ];
hpkgs = pkgs.haskell.packages.ghc981.extend (new: old: {
ppad-base16 = base16;
- ppad-sha256 = sha256;
+ ppad-sha256 = sha256-llvm;
${lib} = new.callCabal2nixWithOptions lib ./. "--enable-profiling" {
ppad-base16 = new.ppad-base16;
ppad-sha256 = new.ppad-sha256;
@@ -60,10 +67,9 @@
buildInputs = [
cabal
cc
+ llvm
];
- inputsFrom = builtins.attrValues self.packages.${system};
-
doBenchmark = true;
shellHook = ''
@@ -72,6 +78,7 @@
echo "cc: $(${cc}/bin/cc --version)"
echo "ghc: $(${ghc}/bin/ghc --version)"
echo "cabal: $(${cabal}/bin/cabal --version)"
+ echo "llc: $(${llvm}/bin/llc --version | head -2 | tail -1)"
'';
};
}
diff --git a/ppad-base58.cabal b/ppad-base58.cabal
@@ -13,6 +13,11 @@ extra-doc-files: CHANGELOG
description:
base58 and base58check encoding/decoding on strict bytestrings.
+flag llvm
+ description: Use GHC's LLVM backend.
+ default: False
+ manual: True
+
source-repository head
type: git
location: git.ppad.tech/base58.git
@@ -22,6 +27,8 @@ library
hs-source-dirs: lib
ghc-options:
-Wall
+ if flag(llvm)
+ ghc-options: -fllvm -O2
exposed-modules:
Data.ByteString.Base58
, Data.ByteString.Base58Check