field: force-inline 5x52 mul and sqr #1859

pull l0rinc wants to merge 1 commits into bitcoin-core:master from l0rinc:l0rinc/force-inline-5x52-mul-sqr changing 4 files +17 −4
  1. l0rinc commented at 1:00 PM on May 30, 2026: contributor

    Problem: The 5x52 field multiplication and squaring routines are hot in group arithmetic and scalar multiplication. Some compilers leave the thin wrappers and int128 inner helpers out of line, which keeps a call boundary in this hot path and limits scheduling of the 64x64->128 arithmetic.

    Fix: Define SECP256K1_FORCE_INLINE next to the existing inline helper and use it for the 5x52 multiplication and squaring wrappers and int128 inner helpers.

    For default optimized builds, this expands to __forceinline on MSVC-compatible compilers and to __attribute__((always_inline)) on GCC-compatible compilers. It falls back to the existing inline spelling when inlining is disabled, when optimization is disabled, when optimizing for size on GCC/Clang, or when _DEBUG is defined.

    Benchmarks: Values are relative changes in Min(us), lower is better.

    Source Host / CPU Compiler ecdsa_verify ecdh schnorrsig_verify field_sqr field_mul
    local M4-Max.local gcc-14 14.3.0 -9.1% -9.0% -9.6% -7.0% -4.0%
    local i9-ssd GCC 16.1.0 -5.3% -4.1% -5.5% -15.7% -11.6%
    local WIN-A2EHOAU4JET / Xeon E5-2637 v2 MSVC 19.50.35728 -2.6% -9.3% -2.4% -7.4% -7.4%
    local i7-hdd GCC 14.2.0 -10.9% -11.1% -10.5% -9.4% -21.6%
    local umbrel / Intel N150 GCC 12.2.0 -4.9% -4.3% -4.6% +0.6% -1.1%
    local rpi5-16-3 GCC 14.2.0 -0.6% -0.7% -0.6% -5.5% -1.0%
    local rpi4-2-1 GCC 14.2.0 -2.7% -2.3% -2.7% -5.6% -4.0%
    local nodl / Cortex-A53 GCC 11.4.0 -3.3% -7.6% -5.7% -9.9% -1.8%
    andrewtoth i9-14900HX GCC 12.3 -5.3% -4.2% -5.6% -1.5% -6.1%
    theStack Snapdragon X Elite X1E-78-100 GCC 14.2.0 -11.2% n/a -11.1% n/a n/a
    sipa Ryzen 5950X GCC 15.2.0 -11.4% -10.4% -8.4% n/a n/a

    <img width="2534" height="1104" alt="image" src="https://github.com/user-attachments/assets/218a4075-5937-4850-ab8b-c6fc5d2fee57" />

    Tradeoffs: The speedups reproduce most consistently with GCC and MSVC. Clang was less consistently positive.

    Inlining also increases code size:

    Platform Artifact Before After Delta
    macOS GCC libsecp256k1.a 1,254,320 1,311,368 +57,048 (+4.55%)
    Linux GCC libsecp256k1.a 1,271,040 1,330,808 +59,768 (+4.70%)
    Windows MSVC Release libsecp256k1-*.dll 1,239,040 1,414,144 +175,104 (+14.13%)

    <details><summary>Linux benchmarking script</summary>

    BEFORE=8363a2d8d1b47857c437f7cf22bd11ab06c7c50f; AFTER=33b1b9c455eb2bb07eded939b36abc49859d2ccf; CC=gcc; \
    API_ITERS=10000; INT_ITERS=200000; JOBS=1; \
    BH=$(git rev-parse --short=12 "$BEFORE") && AH=$(git rev-parse --short=12 "$AFTER") && \
    RUN=$(date +%Y%m%d%H%M%S) && \
    ROOT="$PWD/.bench-builds/gcc-$BH-$AH-$RUN" && \
    RAW="$PWD/.bench-results/secp-bench-gcc-$BH-$AH-$RUN.txt" && \
    (set -e; \
      mkdir -p "$ROOT" "$(dirname "$RAW")"; \
      printf "host: %s, compiler: %s\n" "$(hostname)" "$("$CC" --version | sed -n '1p')" | tee "$RAW" >&2; \
      old=$(git symbolic-ref --short -q HEAD || git rev-parse HEAD); \
      trap 'git switch -q "$old" 2>/dev/null || git switch -q --detach "$old"' EXIT; \
      for side in before after; do \
        ref=$([ "$side" = before ] && printf %s "$BEFORE" || printf %s "$AFTER"); \
        git cat-file -e "$ref^{commit}" 2>/dev/null || git fetch -q origin "$ref"; \
        h=$(git rev-parse --short=12 "$ref"); \
        b="$ROOT/$side-$h"; \
        echo "== $side $h ==" >&2; \
        git switch -q --detach "$ref"; \
        cmake -S . -B "$b" -DCMAKE_C_COMPILER="$CC" -DCMAKE_BUILD_TYPE=Release -DBUILD_SHARED_LIBS=OFF -DSECP256K1_BUILD_BENCHMARK=ON -DSECP256K1_BUILD_TESTS=OFF -DSECP256K1_BUILD_EXHAUSTIVE_TESTS=OFF -DSECP256K1_BUILD_CTIME_TESTS=OFF -DSECP256K1_BUILD_EXAMPLES=OFF -DSECP256K1_ENABLE_MODULE_MUSIG=OFF -DSECP256K1_VALGRIND=OFF >> "$RAW" 2>&1; \
        cmake --build "$b" -j "$JOBS" --target bench bench_internal >> "$RAW" 2>&1; \
        echo "=== $side $ref $h ===" >> "$RAW"; \
        SECP256K1_BENCH_ITERS=$API_ITERS "$b/bin/bench" ecdsa ec ecdh schnorrsig ellswift >> "$RAW"; \
        SECP256K1_BENCH_ITERS=$INT_ITERS "$b/bin/bench_internal" field group ecmult hash context >> "$RAW"; \
      done; \
      awk -F, '/^=== /{split($0,p," "); side=p[2]; next} /^[[:alnum:]_][[:alnum:]_]*[[:space:]]*,/{name=$1; val=$2+0; gsub(/^[[:space:]]+|[[:space:]]+$/,"",name); if(name!="Benchmark"){if(!(name in seen)){seen[name]=1; order[++n]=name} x[side,name]=val}} END{print "Benchmark\tBefore min(us)\tAfter min(us)\tDelta"; for(i=1;i<=n;i++){name=order[i]; b=x["before",name]; a=x["after",name]; if(b&&a) printf "%s\t%.6g\t%.6g\t%+.1f%%\n",name,b,a,100*(a-b)/b}}' "$RAW" | column -t -s $'\t'; \
      echo "raw: $RAW" >&2)
    

    </details>

    <details><summary>Linux size comparison script</summary>

    BEFORE=8363a2d8d1b47857c437f7cf22bd11ab06c7c50f; AFTER=33b1b9c455eb2bb07eded939b36abc49859d2ccf; CC=gcc; JOBS=1; \
    BH=$(git rev-parse --short=12 "$BEFORE"); AH=$(git rev-parse --short=12 "$AFTER"); RUN=$(date +%Y%m%d%H%M%S); ROOT="$PWD/.size-builds/gcc-$BH-$AH-$RUN"; \
    (set -e; old=$(git symbolic-ref --short -q HEAD || git rev-parse HEAD); trap 'git switch -q "$old" 2>/dev/null || git switch -q --detach "$old"' EXIT; \
    printf "host: %s, compiler: %s\n" "$(hostname)" "$("$CC" --version | sed -n '1p')"; \
    for side in before after; do \
      ref=$([ "$side" = before ] && printf %s "$BEFORE" || printf %s "$AFTER"); git cat-file -e "$ref^{commit}" 2>/dev/null || git fetch -q origin "$ref"; h=$(git rev-parse --short=12 "$ref"); b="$ROOT/$side-$h"; \
      git switch -q --detach "$ref"; \
      cmake -S . -B "$b" -DCMAKE_C_COMPILER="$CC" -DCMAKE_BUILD_TYPE=Release -DBUILD_SHARED_LIBS=OFF -DSECP256K1_BUILD_BENCHMARK=OFF -DSECP256K1_BUILD_TESTS=OFF -DSECP256K1_BUILD_EXHAUSTIVE_TESTS=OFF -DSECP256K1_BUILD_CTIME_TESTS=OFF -DSECP256K1_BUILD_EXAMPLES=OFF -DSECP256K1_ENABLE_MODULE_MUSIG=OFF -DSECP256K1_VALGRIND=OFF >/dev/null; \
      cmake --build "$b" -j "$JOBS" --target secp256k1 >/dev/null; \
      lib=$(find "$b" -name 'libsecp256k1.a' -print -quit); \
      bytes=$(wc -c < "$lib" | tr -d ' '); \
      printf "%s\t%s\t%s\n" "$side" "$h" "$bytes"; \
      done | awk 'BEGIN{print "Side\tCommit\tlibsecp256k1.a bytes"} {print; size[$1]=$3} END{if(size["before"]&&size["after"]) printf "Delta\t\t%+d bytes (%+.2f%%)\n",size["after"]-size["before"],100*(size["after"]-size["before"])/size["before"]}' | column -t -s $'\t')
    

    </details>

    <details><summary>host: M4-Max.local, compiler: gcc-14 (Homebrew GCC 14.3.0) 14.3.0</summary>

    Benchmark                 Before min(us)  After min(us)  Delta
    ecdsa_verify              17.5            15.9           -9.1%
    ecdsa_sign                12.3            12.1           -1.6%
    ec_keygen                 8.07            7.77           -3.7%
    ecdh                      16.6            15.1           -9.0%
    schnorrsig_sign           8.6             8.29           -3.6%
    schnorrsig_verify         17.8            16.1           -9.6%
    ellswift_encode           11.1            11.1           +0.0%
    ellswift_decode           4.68            4.69           +0.2%
    ellswift_keygen           19.4            19.1           -1.5%
    ellswift_ecdh             18.5            17.1           -7.6%
    field_half                0.00154         0.00155        +0.6%
    field_normalize           0.00665         0.00672        +1.1%
    field_normalize_weak      0.00291         0.00291        +0.0%
    field_sqr                 0.00871         0.0081         -7.0%
    field_mul                 0.00969         0.0093         -4.0%
    field_inverse             1.57            1.58           +0.6%
    field_inverse_var         0.735           0.742          +1.0%
    field_is_square_var       0.994           1              +0.6%
    field_sqrt                2.21            2.22           +0.5%
    group_double_var          0.0502          0.0447         -11.0%
    group_add_var             0.126           0.11           -12.7%
    group_add_affine          0.1             0.0922         -7.8%
    group_add_affine_var      0.0887          0.077          -13.2%
    group_add_zinv_var        0.106           0.0902         -14.9%
    group_to_affine_var       0.774           0.774          +0.0%
    ecmult_wnaf               0.334           0.334          +0.0%
    hash_sha256               0.12            0.12           +0.0%
    hash_hmac_sha256          0.464           0.463          -0.2%
    hash_rfc6979_hmac_sha256  2.55            2.55           +0.0%
    context_create            1.96            1.96           +0.0%
    
    Side    Commit                 libsecp256k1.a bytes
    before  8363a2d8d1b4           1254320
    after   33b1b9c455eb           1311368
    Delta   +57048 bytes (+4.55%)
    

    </details>

    <details><summary>host: WIN-A2EHOAU4JET (Intel(R) Xeon(R) CPU E5-2637 v2 @ 3.50GHz), system: Microsoft Windows NT 10.0.20348.0, compiler: Microsoft (R) C/C++ Optimizing Compiler Version 19.50.35728 for x64</summary>

    Benchmark                    Before min(us) After min(us)    Delta
    ecdsa_verify                           74.1          72.2    -2.6%
    ecdsa_sign                             43.3          41.4    -4.4%
    ec_keygen                              32.3            30    -7.1%
    ecdh                                     75            68    -9.3%
    schnorrsig_sign                        34.1            32    -6.2%
    schnorrsig_verify                      74.9          73.1    -2.4%
    ellswift_encode                        32.3          32.5    +0.6%
    ellswift_decode                        14.4          14.6    +1.4%
    ellswift_keygen                        64.6          62.9    -2.6%
    ellswift_ecdh                          80.2          73.7    -8.1%
    field_half                          0.00378       0.00378    +0.0%
    field_normalize                      0.0114        0.0114    +0.0%
    field_normalize_weak                0.00389       0.00389    +0.0%
    field_sqr                            0.0272        0.0252    -7.4%
    field_mul                            0.0394        0.0365    -7.4%
    field_inverse                          3.27          3.29    +0.6%
    field_inverse_var                      2.07          2.11    +1.9%
    field_is_square_var                     2.7          2.67    -1.1%
    field_sqrt                             7.47          6.98    -6.6%
    group_double_var                      0.245         0.207   -15.5%
    group_add_var                           0.6         0.525   -12.5%
    group_add_affine                      0.465         0.405   -12.9%
    group_add_affine_var                  0.418         0.358   -14.4%
    group_add_zinv_var                    0.458         0.403   -12.0%
    group_to_affine_var                    2.25          2.26    +0.4%
    ecmult_wnaf                            0.58          0.59    +1.7%
    hash_sha256                           0.332         0.333    +0.3%
    hash_hmac_sha256                       1.31          1.31    +0.0%
    hash_rfc6979_hmac_sha256               7.23           7.2    -0.4%
    context_create                         3.32          3.34    +0.6%
    
    Side     Commit          DLL bytes
    before   8363a2d8d1b4      1239040
    after    a37e34e187da      1414144
    Delta                      175104 (+14.13%)
    

    </details>

    <details><summary>host: i9-ssd, compiler: gcc (GCC) 16.1.0</summary>

    Benchmark                 Before min(us)  After min(us)  Delta
    ecdsa_verify              39.6            37.5           -5.3%
    ecdsa_sign                27.1            26.4           -2.6%
    ec_keygen                 18.2            17.5           -3.8%
    ecdh                      39              37.4           -4.1%
    schnorrsig_sign           19.5            18.7           -4.1%
    schnorrsig_verify         40.3            38.1           -5.5%
    ellswift_encode           20.1            19.9           -1.0%
    ellswift_decode           8.59            8.46           -1.5%
    ellswift_keygen           38.2            37.3           -2.4%
    ellswift_ecdh             43.4            40.9           -5.8%
    field_half                0.00275         0.00275        +0.0%
    field_normalize           0.00995         0.00994        -0.1%
    field_normalize_weak      0.00378         0.00378        +0.0%
    field_sqr                 0.0178          0.015          -15.7%
    field_mul                 0.019           0.0168         -11.6%
    field_inverse             2.41            2.39           -0.8%
    field_inverse_var         1.32            1.28           -3.0%
    field_is_square_var       1.69            1.68           -0.6%
    field_sqrt                4.21            4.16           -1.2%
    group_double_var          0.121           0.115          -5.0%
    group_add_var             0.309           0.272          -12.0%
    group_add_affine          0.248           0.231          -6.9%
    group_add_affine_var      0.216           0.194          -10.2%
    group_add_zinv_var        0.245           0.213          -13.1%
    group_to_affine_var       1.41            1.36           -3.5%
    ecmult_wnaf               0.536           0.581          +8.4%
    hash_sha256               0.29            0.286          -1.4%
    hash_hmac_sha256          1.14            1.13           -0.9%
    hash_rfc6979_hmac_sha256  6.3             6.21           -1.4%
    context_create            2.68            2.68           +0.0%
    
    Side    Commit        libsecp256k1.a bytes
    before  8363a2d8d1b4  1271040
    after   33b1b9c455eb  1330808
    Delta                 +59768 bytes (+4.70%)
    

    </details>

    <details><summary>host: i7-hdd, compiler: gcc (Ubuntu 14.2.0-19ubuntu2) 14.2.0</summary>

    Benchmark                 Before min(us)  After min(us)  Delta
    ecdsa_verify              43.1            38.4           -10.9%
    ecdsa_sign                28.4            27.3           -3.9%
    ec_keygen                 19.3            18             -6.7%
    ecdh                      43.2            38.4           -11.1%
    schnorrsig_sign           20.6            19.4           -5.8%
    schnorrsig_verify         43.7            39.1           -10.5%
    ellswift_encode           19.9            19.7           -1.0%
    ellswift_decode           8.48            8.41           -0.8%
    ellswift_keygen           39.2            37.8           -3.6%
    ellswift_ecdh             46.4            41.8           -9.9%
    field_half                0.00275         0.00275        +0.0%
    field_normalize           0.00998         0.00998        +0.0%
    field_normalize_weak      0.00402         0.00402        +0.0%
    field_sqr                 0.017           0.0154         -9.4%
    field_mul                 0.0218          0.0171         -21.6%
    field_inverse             2.49            2.46           -1.2%
    field_inverse_var         1.36            1.35           -0.7%
    field_is_square_var       1.66            1.67           +0.6%
    field_sqrt                4.07            4.07           +0.0%
    group_double_var          0.132           0.119          -9.8%
    group_add_var             0.346           0.28           -19.1%
    group_add_affine          0.266           0.236          -11.3%
    group_add_affine_var      0.243           0.201          -17.3%
    group_add_zinv_var        0.265           0.216          -18.5%
    group_to_affine_var       1.46            1.44           -1.4%
    ecmult_wnaf               0.554           0.604          +9.0%
    hash_sha256               0.305           0.298          -2.3%
    hash_hmac_sha256          1.18            1.17           -0.8%
    hash_rfc6979_hmac_sha256  6.47            6.43           -0.6%
    context_create            2.73            2.71           -0.7%
    

    </details>

    <details><summary>host: rpi5-16-3, compiler: gcc (Ubuntu 14.2.0-19ubuntu2) 14.2.0</summary>

    Benchmark                 Before min(us)  After min(us)  Delta
    ecdsa_verify              157             156            -0.6%
    ecdsa_sign                69.5            69.3           -0.3%
    ec_keygen                 57.6            57.5           -0.2%
    ecdh                      149             148            -0.7%
    schnorrsig_sign           59.3            59             -0.5%
    schnorrsig_verify         158             157            -0.6%
    ellswift_encode           44.9            44.8           -0.2%
    ellswift_decode           24.2            24.2           +0.0%
    ellswift_keygen           103             102            -1.0%
    ellswift_ecdh             154             154            +0.0%
    field_half                0.00334         0.00334        +0.0%
    field_normalize           0.0143          0.0144         +0.7%
    field_normalize_weak      0.00543         0.00543        +0.0%
    field_sqr                 0.0654          0.0618         -5.5%
    field_mul                 0.0919          0.091          -1.0%
    field_inverse             4.8             4.78           -0.4%
    field_inverse_var         2.24            2.24           +0.0%
    field_is_square_var       2.31            2.31           +0.0%
    field_sqrt                17              17             +0.0%
    group_double_var          0.526           0.525          -0.2%
    group_add_var             1.35            1.34           -0.7%
    group_add_affine          0.988           0.984          -0.4%
    group_add_affine_var      0.926           0.915          -1.2%
    group_add_zinv_var        1.02            1.01           -1.0%
    group_to_affine_var       2.6             2.6            +0.0%
    ecmult_wnaf               0.606           0.614          +1.3%
    hash_sha256               0.316           0.315          -0.3%
    hash_hmac_sha256          1.2             1.2            +0.0%
    hash_rfc6979_hmac_sha256  6.62            6.62           +0.0%
    context_create            4.18            4.18           +0.0%
    

    </details>

    <details><summary>host: rpi4-2-1, compiler: gcc (Ubuntu 14.2.0-19ubuntu2) 14.2.0</summary>

    Benchmark                 Before min(us)  After min(us)  Delta
    ecdsa_verify              222             216            -2.7%
    ecdsa_sign                111             109            -1.8%
    ec_keygen                 90.4            88.6           -2.0%
    ecdh                      216             211            -2.3%
    schnorrsig_sign           93.4            91.4           -2.1%
    schnorrsig_verify         224             218            -2.7%
    ellswift_encode           64.2            64.1           -0.2%
    ellswift_decode           33.5            33.5           +0.0%
    ellswift_keygen           156             153            -1.9%
    ellswift_ecdh             226             220            -2.7%
    field_half                0.00447         0.00447        +0.0%
    field_normalize           0.0215          0.0215         +0.0%
    field_normalize_weak      0.00783         0.00783        +0.0%
    field_sqr                 0.0871          0.0822         -5.6%
    field_mul                 0.126           0.121          -4.0%
    field_inverse             8.54            8.54           +0.0%
    field_inverse_var         3.25            3.25           +0.0%
    field_is_square_var       3.57            3.57           +0.0%
    field_sqrt                22.7            22.6           -0.4%
    group_double_var          0.72            0.71           -1.4%
    group_add_var             1.87            1.8            -3.7%
    group_add_affine          1.4             1.36           -2.9%
    group_add_affine_var      1.3             1.24           -4.6%
    group_add_zinv_var        1.42            1.37           -3.5%
    group_to_affine_var       3.76            3.75           -0.3%
    ecmult_wnaf               1.06            1.05           -0.9%
    hash_sha256               0.532           0.531          -0.2%
    hash_hmac_sha256          2.02            2.02           +0.0%
    hash_rfc6979_hmac_sha256  11.2            11.2           +0.0%
    context_create            6.8             6.8            +0.0%
    

    </details>

    <details><summary>host: umbrel (Intel(R) N150), compiler: gcc (Debian 12.2.0-14+deb12u1) 12.2.0</summary>

    Benchmark                 Before min(us)  After min(us)  Delta
    ecdsa_verify              371             353            -4.9%
    ecdsa_sign                163             160            -1.8%
    ec_keygen                 129             123            -4.7%
    ecdh                      347             332            -4.3%
    schnorrsig_sign           131             126            -3.8%
    schnorrsig_verify         373             356            -4.6%
    ellswift_encode           143             142            -0.7%
    ellswift_decode           71.3            70.8           -0.7%
    ellswift_keygen           272             268            -1.5%
    ellswift_ecdh             367             352            -4.1%
    field_half                0.0124          0.0124         +0.0%
    field_normalize           0.0439          0.0439         +0.0%
    field_normalize_weak      0.0192          0.0192         +0.0%
    field_sqr                 0.168           0.169          +0.6%
    field_mul                 0.182           0.18           -1.1%
    field_inverse             11.2            11.2           +0.0%
    field_inverse_var         8.44            8.4            -0.5%
    field_is_square_var       9.56            9.55           -0.1%
    field_sqrt                45              44             -2.2%
    group_double_var          1.25            1.18           -5.6%
    group_add_var             2.92            2.68           -8.2%
    group_add_affine          2.22            2.12           -4.5%
    group_add_affine_var      2.02            1.86           -7.9%
    group_add_zinv_var        2.21            2.01           -9.0%
    group_to_affine_var       9.25            9.13           -1.3%
    ecmult_wnaf               2.51            2.45           -2.4%
    hash_sha256               1.13            1.12           -0.9%
    hash_hmac_sha256          4.44            4.44           +0.0%
    hash_rfc6979_hmac_sha256  24.4            24.4           +0.0%
    context_create            14.2            14.1           -0.7%
    

    </details>

    <details><summary>host: nodl (Cortex-A53), compiler: gcc (Ubuntu 11.4.0-1ubuntu1~22.04.3) 11.4.0</summary>

    Benchmark                 Before min(us)  After min(us)  Delta
    ecdsa_verify              632             611            -3.3%
    ecdsa_sign                308             291            -5.5%
    ec_keygen                 228             212            -7.0%
    ecdh                      633             585            -7.6%
    schnorrsig_sign           231             221            -4.3%
    schnorrsig_verify         630             594            -5.7%
    ellswift_encode           156             156            +0.0%
    ellswift_decode           80              76.1           -4.9%
    ellswift_keygen           438             455            +3.9%
    ellswift_ecdh             613             599            -2.3%
    field_half                0.0106          0.00985        -7.1%
    field_normalize           0.0483          0.0499         +3.3%
    field_normalize_weak      0.0173          0.0173         +0.0%
    field_sqr                 0.202           0.182          -9.9%
    field_mul                 0.278           0.273          -1.8%
    field_inverse             21.3            21.1           -0.9%
    field_inverse_var         7.67            7.48           -2.5%
    field_is_square_var       8.73            8.91           +2.1%
    field_sqrt                65.8            61.9           -5.9%
    group_double_var          2.04            1.9            -6.9%
    group_add_var             5.35            5.09           -4.9%
    group_add_affine          3.93            3.51           -10.7%
    group_add_affine_var      3.56            3.32           -6.7%
    group_add_zinv_var        3.94            3.65           -7.4%
    group_to_affine_var       9.56            10.4           +8.8%
    ecmult_wnaf               2.37            2.48           +4.6%
    hash_sha256               1.13            1.19           +5.3%
    hash_hmac_sha256          5.08            4.76           -6.3%
    hash_rfc6979_hmac_sha256  33.3            31.2           -6.3%
    context_create            19.3            18.8           -2.6%
    

    </details>

    <details><summary>Reviewer measurements</summary>

    andrewtoth, i9-14900HX, GCC 12.3

    Benchmark                 Before min(us)  After min(us)  Delta
    ecdsa_verify              22.7            21.5           -5.3%
    ecdsa_sign                14.3            14.0           -2.1%
    ec_keygen                 9.90            9.54           -3.6%
    ecdh                      21.6            20.7           -4.2%
    schnorrsig_sign           10.6            10.2           -3.8%
    schnorrsig_verify         23.1            21.8           -5.6%
    ellswift_ecdh             23.8            22.7           -4.6%
    field_sqr                 0.00912         0.00898        -1.5%
    field_mul                 0.0114          0.0107         -6.1%
    field_inverse             1.23            1.24           +0.8%
    field_inverse_var         0.770           0.773          +0.4%
    field_is_square_var       1.06            1.05           -0.9%
    field_sqrt                2.82            2.46           -12.8%
    group_double_var          0.0701          0.0612         -12.7%
    group_add_var             0.168           0.153          -8.9%
    group_add_affine          0.132           0.123          -6.8%
    group_add_affine_var      0.120           0.103          -14.2%
    group_add_zinv_var        0.138           0.117          -15.2%
    group_to_affine_var       0.820           0.819          -0.1%
    

    theStack, Snapdragon X Elite X1E-78-100, GCC 14.2.0

    Benchmark                 Before min(us)  After min(us)  Delta
    ecdsa_verify              24.1            21.4           -11.2%
    ecdsa_sign                19.0            18.5           -2.6%
    schnorrsig_sign           13.0            12.7           -2.3%
    schnorrsig_verify         24.4            21.7           -11.1%
    

    Bitcoin Core subtree bench_bitcoin -filter=VerifyScript.*:

    Benchmark                   Before ns/script  After ns/script  Delta
    VerifyScriptP2TR_KeyPath    23679.52          20899.66         -11.7%
    VerifyScriptP2TR_ScriptPath 43430.71          39280.19         -9.6%
    VerifyScriptP2WPKH          23526.82          20870.22         -11.3%
    

    sipa, Ryzen 5950X, GCC 15.2.0

    Benchmark                 Before min(us)  After min(us)  Delta
    ecdsa_verify              30.8            27.3           -11.4%
    ecdsa_sign                18.7            17.2           -8.0%
    ec_keygen                 13.6            12.2           -10.3%
    ecdh                      29.8            26.7           -10.4%
    ecdsa_recover             31.0            28.2           -9.0%
    schnorrsig_sign           14.4            13.0           -9.7%
    schnorrsig_verify         31.1            28.5           -8.4%
    ellswift_encode           13.2            13.4           +1.5%
    ellswift_decode           5.79            5.84           +0.9%
    ellswift_keygen           26.8            25.7           -4.1%
    ellswift_ecdh             32.1            29.6           -7.8%
    

    </details>


    clang:

    <details><summary>host: i9-ssd, compiler: Ubuntu clang version 22.1.6 (++20260508084839+c0262e742787-1~exp1~20260508204859.77)</summary>

    Benchmark                 Before min(us)  After min(us)  Delta
    ecdsa_verify              40.1            39.8           -0.7%
    ecdsa_sign                29.2            29.1           -0.3%
    ec_keygen                 19.5            19.6           +0.5%
    ecdh                      40.3            39.8           -1.2%
    schnorrsig_sign           21              20.9           -0.5%
    schnorrsig_verify         40.6            40.3           -0.7%
    ellswift_encode           20.1            20.1           +0.0%
    ellswift_decode           8.43            8.41           -0.2%
    ellswift_keygen           39.8            39.7           -0.3%
    ellswift_ecdh             44.1            43.5           -1.4%
    field_half                0.0028          0.0028         +0.0%
    field_normalize           0.00889         0.00891        +0.2%
    field_normalize_weak      0.0037          0.0037         +0.0%
    field_sqr                 0.0144          0.0144         +0.0%
    field_mul                 0.021           0.019          -9.5%
    field_inverse             2.6             2.64           +1.5%
    field_inverse_var         1.34            1.35           +0.7%
    field_is_square_var       1.73            1.73           +0.0%
    field_sqrt                3.95            3.96           +0.3%
    group_double_var          0.128           0.125          -2.3%
    group_add_var             0.311           0.31           -0.3%
    group_add_affine          0.243           0.242          -0.4%
    group_add_affine_var      0.207           0.207          +0.0%
    group_add_zinv_var        0.229           0.228          -0.4%
    group_to_affine_var       1.43            1.44           +0.7%
    ecmult_wnaf               0.536           0.598          +11.6%
    hash_sha256               0.3             0.299          -0.3%
    hash_hmac_sha256          1.18            1.18           +0.0%
    hash_rfc6979_hmac_sha256  6.51            6.53           +0.3%
    context_create            2.16            2.15           -0.5%
    

    </details>

    reindex-chainstate:

    <details><summary>2026-05-28 | reindex-chainstate | 950059 blocks | dbcache 5000 | i9-ssd | x86_64 | Intel(R) Core(TM) i9-9900K CPU @ 3.60GHz | 16 cores | 62Gi RAM | SSD</summary>

    for DBCACHE in 5000; do \
        COMMITS="67250b1d97e6159d908ef44639b6a12471e7c717 c264526415f38afb9890003003b7de39b370b745"; \
        STOP=950059; CC=gcc; CXX=g++; \
        BASE_DIR="/mnt/my_storage"; DATA_DIR="$BASE_DIR/BitcoinData"; LOG_DIR="$BASE_DIR/logs"; \
        (echo ""; for c in $COMMITS; do git fetch -q origin "$c" 2>/dev/null || true; git log -1 --pretty='%h %s' $c || exit 1; done) && \
        (echo "" && echo "$(date -I) | reindex-chainstate | ${STOP} blocks | dbcache ${DBCACHE} | $(hostname) | $(uname -m) | $(lscpu | grep 'Model name' | head -1 | cut -d: -f2 | xargs) | $(nproc) cores | $(free -h | awk '/^Mem:/{print $2}') RAM | $(l
    sblk -no ROTA $(df --output=source $BASE_DIR | tail -1) | grep -q 1 && echo HDD || echo SSD)"; echo "") && \
        hyperfine \
        --sort command \
        --runs 1 \
        --export-json "$BASE_DIR/rdx-$(sed -E 's/[^ ]+/\L&/g;s/[.]/_/g;s/ /-/g'<<<"$COMMITS")-$STOP-$DBCACHE-$CC.json" \
        --parameter-list COMMIT ${COMMITS// /,} \
        --prepare "killall -9 bitcoind 2>/dev/null; rm -f ./build/bin/bitcoind; git clean -fxd; git reset --hard {COMMIT} && \
          cmake -B build -G Ninja -DCMAKE_BUILD_TYPE=Release && ninja -C build bitcoind -j1 && \
          ./build/bin/bitcoind -datadir=$DATA_DIR -stopatheight=$STOP -dbcache=1000 -printtoconsole=0; sleep 20; rm -f $DATA_DIR/debug.log; rm -rfd $DATA_DIR/indexes;" \
        --conclude "killall bitcoind || true; sleep 5; grep -q 'height=0' $DATA_DIR/debug.log && grep -q 'Disabling script verification at block [#1](/bitcoin-core-secp256k1/1/)' $DATA_DIR/debug.log && grep -q 'height=$STOP' $DATA_DIR/debug.log && grep 'Bitcoin Core version' $DATA_
    DIR/debug.log | grep -q \"\$(git rev-parse --short=12 {COMMIT})\"; \
                    cp $DATA_DIR/debug.log $LOG_DIR/debug-{COMMIT}-$(date +%s).log" \
        "COMPILER=$CC ./build/bin/bitcoind -datadir=$DATA_DIR -stopatheight=$STOP -dbcache=$DBCACHE -reindex-chainstate -blocksonly -connect=0 -printtoconsole=0 -assumevalid=0"; \
    done
    
    67250b1d97 parallel input fetcher
    c264526415 Refactor: optimize scalar reduction and arithmetic functions.
    
    2026-05-28 | reindex-chainstate | 950059 blocks | dbcache 5000 | i9-ssd | x86_64 | Intel(R) Core(TM) i9-9900K CPU @ 3.60GHz | 16 cores | 62Gi RAM | SSD
    
    Benchmark 1: COMPILER=gcc ./build/bin/bitcoind -datadir=/mnt/my_storage/BitcoinData -stopatheight=950059 -dbcache=5000 -reindex-chainstate -blocksonly -connect=0 -printtoconsole=0 -assumevalid=0 (COMMIT = 67250b1d97e6159d908ef44639b6a12471e7c717)
      Time (abs ≡):        37155.108 s               [User: 375835.978 s, System: 978.929 s]
    
    Benchmark 2: COMPILER=gcc ./build/bin/bitcoind -datadir=/mnt/my_storage/BitcoinData -stopatheight=950059 -dbcache=5000 -reindex-chainstate -blocksonly -connect=0 -printtoconsole=0 -assumevalid=0 (COMMIT = c264526415f38afb9890003003b7de39b370b745)
      Time (abs ≡):        36261.785 s               [User: 362247.387 s, System: 1002.867 s]
    
    Relative speed comparison
            1.02          COMPILER=gcc ./build/bin/bitcoind -datadir=/mnt/my_storage/BitcoinData -stopatheight=950059 -dbcache=5000 -reindex-chainstate -blocksonly -connect=0 -printtoconsole=0 -assumevalid=0 (COMMIT = 67250b1d97e6159d908ef44639b6a12471e7c717)
            1.00          COMPILER=gcc ./build/bin/bitcoind -datadir=/mnt/my_storage/BitcoinData -stopatheight=950059 -dbcache=5000 -reindex-chainstate -blocksonly -connect=0 -printtoconsole=0 -assumevalid=0 (COMMIT = c264526415f38afb9890003003b7de39b370b745)
    

    </details>

  2. l0rinc closed this on May 30, 2026

  3. l0rinc reopened this on May 30, 2026

  4. real-or-random added the label performance on Jun 1, 2026
  5. andrewtoth commented at 3:41 PM on June 1, 2026: none

    Ran the benchmarks on i9-14900HX built with GCC 12.3, confirmed the speedups:

    Results (Min us, lower is better)

    Benchmark Before After Delta
    ecdsa_verify 22.7 21.5 -5.3%
    ecdsa_sign 14.3 14.0 -2.1%
    ec_keygen 9.90 9.54 -3.6%
    ecdh 21.6 20.7 -4.2%
    schnorrsig_sign 10.6 10.2 -3.8%
    schnorrsig_verify 23.1 21.8 -5.6%
    ellswift_ecdh 23.8 22.7 -4.6%
    field_sqr 0.00912 0.00898 -1.5%
    field_mul 0.0114 0.0107 -6.1%
    field_inverse 1.23 1.24 +0.8%
    field_inverse_var 0.770 0.773 +0.4%
    field_is_square_var 1.06 1.05 -0.9%
    field_sqrt 2.82 2.46 -12.8%
    group_double_var 0.0701 0.0612 -12.7%
    group_add_var 0.168 0.153 -8.9%
    group_add_affine 0.132 0.123 -6.8%
    group_add_affine_var 0.120 0.103 -14.2%
    group_add_zinv_var 0.138 0.117 -15.2%
    group_to_affine_var 0.820 0.819 -0.1%
  6. theStack commented at 1:14 AM on June 2, 2026: contributor

    Seeing a ~12.5% speedup for both ECDSA and Schnorr verification and ~3% for signing on my arm64 machine (Snapdragon X Elite - X1E-78-100), using GCC 14.2.0:

    master:

    $ ./build/bin/bench verify sign
    Benchmark                     ,    Min(us)    ,    Avg(us)    ,    Max(us)    
    
    ecdsa_verify                  ,    24.1       ,    24.1       ,    24.5    
    ecdsa_sign                    ,    19.0       ,    19.0       ,    19.1    
    schnorrsig_sign               ,    13.0       ,    13.1       ,    13.2    
    schnorrsig_verify             ,    24.4       ,    24.4       ,    24.5
    

    PR:

    $ ./build/bin/bench verify sign
    Benchmark                     ,    Min(us)    ,    Avg(us)    ,    Max(us)    
    
    ecdsa_verify                  ,    21.4       ,    21.4       ,    21.8    
    ecdsa_sign                    ,    18.5       ,    18.5       ,    18.5    
    schnorrsig_sign               ,    12.7       ,    12.7       ,    12.7    
    schnorrsig_verify             ,    21.7       ,    21.7       ,    21.7
    

    Applying this change to the Bitcoin Core secp256k1 subtree (Branch apply-secp-pr1859) shows the speedup in the script verification benchmarks as well (run via ./build/bin/bench_bitcoin -filter=VerifyScript.*):

    master (commit https://github.com/theStack/bitcoin/commit/654a5223af532e965998bb1d6988be421fba186f):

    | ns/script | script/s | err% | total | benchmark |--------------------:|--------------------:|--------:|----------:|:---------- | 23,679.52 | 42,230.58 | 0.3% | 0.01 | VerifyScriptP2TR_KeyPath | 43,430.71 | 23,025.18 | 0.4% | 0.01 | VerifyScriptP2TR_ScriptPath | 23,526.82 | 42,504.68 | 0.3% | 0.01 | VerifyScriptP2WPKH

    PR applied (commit https://github.com/theStack/bitcoin/commit/494a4734c408ebb78802dc8bf25836ed5dc4470f):

    | ns/script | script/s | err% | total | benchmark |--------------------:|--------------------:|--------:|----------:|:---------- | 20,899.66 | 47,847.67 | 0.3% | 0.01 | VerifyScriptP2TR_KeyPath | 39,280.19 | 25,458.13 | 0.8% | 0.01 | VerifyScriptP2TR_ScriptPath | 20,870.22 | 47,915.16 | 0.6% | 0.01 | VerifyScriptP2WPKH

  7. in src/util.h:62 in ac915c9886
      56 | @@ -57,6 +57,14 @@ static void print_buf_plain(const unsigned char *buf, size_t len) {
      57 |  #  define SECP256K1_INLINE inline
      58 |  # endif
      59 |  
      60 | +# if defined(_MSC_VER)
      61 | +#  define SECP256K1_ALWAYS_INLINE __forceinline
      62 | +# elif SECP256K1_GNUC_PREREQ(3, 0)
    


    real-or-random commented at 7:03 AM on June 2, 2026:

    I suggest adding this to force inlining only if the user

    • has not disabled inlining -fno-inline (always_inline would override this) and
    • has enabled optimizations at all (but not when optimizing for size)

    I verified that clang defines these macros too if the corresponding options are provided.

    # elif SECP256K1_GNUC_PREREQ(3, 0) && !__NO_INLINE__ && __OPTIMIZE__ && !__OPTIMIZE_SIZE__
    

    Can you do something similar for MSVC?


    l0rinc commented at 9:42 PM on June 3, 2026:

    For GCC/Clang, -fno-inline, non-optimized builds, and size-optimized builds fall back because the compilers expose __NO_INLINE__, __OPTIMIZE__, and __OPTIMIZE_SIZE__.

    For MSVC, I added the _DEBUG guard, which disables __forceinline for debug-style builds. The remaining difference is MinSizeRel: MSVC /O1 does not appear to expose a preprocessor macro equivalent to __OPTIMIZE_SIZE__, so MinSizeRel still uses __forceinline there. If disabling this for MSVC MinSizeRel is important, I think the cleanest option is a small build-system define for that configuration.

    <details><summary>host: i7-hdd, compiler: gcc (Ubuntu 14.2.0-19ubuntu2) 14.2.0</summary>

    mode: release, build_type: Release, cflags: none
    == release before a39093de1534 ==
    == release after 1c537ab86814 ==
    Benchmark                 Before min(us)  After min(us)  Delta
    ecdsa_verify              43              38.4           -10.7%
    ecdsa_sign                28.5            27.2           -4.6%
    ec_keygen                 19.3            18             -6.7%
    ecdh                      43.4            38.2           -12.0%
    schnorrsig_sign           20.7            19.4           -6.3%
    schnorrsig_verify         43.7            39             -10.8%
    ellswift_encode           19.9            19.6           -1.5%
    ellswift_decode           8.48            8.41           -0.8%
    ellswift_keygen           39.4            37.8           -4.1%
    ellswift_ecdh             46.4            41.8           -9.9%
    field_half                0.00275         0.00275        +0.0%
    field_normalize           0.00998         0.00998        +0.0%
    field_normalize_weak      0.00402         0.00402        +0.0%
    field_sqr                 0.017           0.0154         -9.4%
    field_mul                 0.0218          0.0171         -21.6%
    field_inverse             2.45            2.46           +0.4%
    field_inverse_var         1.36            1.35           -0.7%
    field_is_square_var       1.66            1.67           +0.6%
    field_sqrt                4.07            4.07           +0.0%
    group_double_var          0.133           0.119          -10.5%
    group_add_var             0.346           0.28           -19.1%
    group_add_affine          0.266           0.236          -11.3%
    group_add_affine_var      0.243           0.201          -17.3%
    group_add_zinv_var        0.266           0.216          -18.8%
    group_to_affine_var       1.46            1.44           -1.4%
    ecmult_wnaf               0.554           0.604          +9.0%
    hash_sha256               0.304           0.298          -2.0%
    hash_hmac_sha256          1.18            1.17           -0.8%
    hash_rfc6979_hmac_sha256  6.46            6.43           -0.5%
    context_create            2.72            2.71           -0.4%
    
    mode: noinline, build_type: Release, cflags: -fno-inline
    == noinline before a39093de1534 ==
    == noinline after 1c537ab86814 ==
    Benchmark                 Before min(us)  After min(us)  Delta
    ecdsa_verify              149             149            +0.0%
    ecdsa_sign                63.8            63.9           +0.2%
    ec_keygen                 53.1            53.1           +0.0%
    ecdh                      142             142            +0.0%
    schnorrsig_sign           54.7            54.7           +0.0%
    schnorrsig_verify         150             150            +0.0%
    ellswift_encode           42.9            43             +0.2%
    ellswift_decode           23.5            23.5           +0.0%
    ellswift_keygen           96              96.1           +0.1%
    ellswift_ecdh             147             147            +0.0%
    field_half                0.00367         0.00367        +0.0%
    field_normalize           0.00998         0.00998        +0.0%
    field_normalize_weak      0.00475         0.00476        +0.2%
    field_sqr                 0.0617          0.0617         +0.0%
    field_mul                 0.0793          0.0793         +0.0%
    field_inverse             3.35            3.35           +0.0%
    field_inverse_var         1.98            1.98           +0.0%
    field_is_square_var       2.02            2.02           +0.0%
    field_sqrt                16.9            16.9           +0.0%
    group_double_var          0.505           0.503          -0.4%
    group_add_var             1.22            1.22           +0.0%
    group_add_affine          0.927           0.928          +0.1%
    group_add_affine_var      0.846           0.844          -0.2%
    group_add_zinv_var        0.924           0.922          -0.2%
    group_to_affine_var       2.33            2.33           +0.0%
    ecmult_wnaf               0.729           0.731          +0.3%
    hash_sha256               0.305           0.305          +0.0%
    hash_hmac_sha256          1.21            1.21           +0.0%
    hash_rfc6979_hmac_sha256  6.64            6.64           +0.0%
    context_create            13.4            13.4           +0.0%
    
    mode: debug, build_type: Release, cflags: -D_DEBUG
    == debug before a39093de1534 ==
    == debug after 1c537ab86814 ==
    Benchmark                 Before min(us)  After min(us)  Delta
    ecdsa_verify              43              43.1           +0.2%
    ecdsa_sign                28.5            28.5           +0.0%
    ec_keygen                 19.3            19.3           +0.0%
    ecdh                      43.3            43.4           +0.2%
    schnorrsig_sign           20.6            20.7           +0.5%
    schnorrsig_verify         43.7            43.7           +0.0%
    ellswift_encode           19.9            19.9           +0.0%
    ellswift_decode           8.48            8.48           +0.0%
    ellswift_keygen           39.3            39.3           +0.0%
    ellswift_ecdh             46.4            46.5           +0.2%
    field_half                0.00275         0.00275        +0.0%
    field_normalize           0.00998         0.00998        +0.0%
    field_normalize_weak      0.00402         0.00402        +0.0%
    field_sqr                 0.017           0.017          +0.0%
    field_mul                 0.0218          0.0218         +0.0%
    field_inverse             2.45            2.45           +0.0%
    field_inverse_var         1.36            1.36           +0.0%
    field_is_square_var       1.66            1.66           +0.0%
    field_sqrt                4.07            4.07           +0.0%
    group_double_var          0.132           0.132          +0.0%
    group_add_var             0.346           0.346          +0.0%
    group_add_affine          0.266           0.266          +0.0%
    group_add_affine_var      0.244           0.244          +0.0%
    group_add_zinv_var        0.266           0.266          +0.0%
    group_to_affine_var       1.46            1.47           +0.7%
    ecmult_wnaf               0.554           0.554          +0.0%
    hash_sha256               0.304           0.304          +0.0%
    hash_hmac_sha256          1.18            1.18           +0.0%
    hash_rfc6979_hmac_sha256  6.47            6.46           -0.2%
    context_create            2.72            2.73           +0.4%
    
    mode: debug-noinline, build_type: Release, cflags: -D_DEBUG -fno-inline
    == debug-noinline before a39093de1534 ==
    == debug-noinline after 1c537ab86814 ==
    Benchmark                 Before min(us)  After min(us)  Delta
    ecdsa_verify              149             149            +0.0%
    ecdsa_sign                63.9            63.9           +0.0%
    ec_keygen                 53.3            53.3           +0.0%
    ecdh                      142             142            +0.0%
    schnorrsig_sign           54.7            54.7           +0.0%
    schnorrsig_verify         150             150            +0.0%
    ellswift_encode           42.9            42.9           +0.0%
    ellswift_decode           23.5            23.5           +0.0%
    ellswift_keygen           96              96.1           +0.1%
    ellswift_ecdh             147             147            +0.0%
    field_half                0.00367         0.00367        +0.0%
    field_normalize           0.00998         0.00998        +0.0%
    field_normalize_weak      0.00476         0.00476        +0.0%
    field_sqr                 0.0618          0.0618         +0.0%
    field_mul                 0.0792          0.0792         +0.0%
    field_inverse             3.33            3.35           +0.6%
    field_inverse_var         1.98            1.98           +0.0%
    field_is_square_var       2.03            2.03           +0.0%
    field_sqrt                16.9            16.9           +0.0%
    group_double_var          0.504           0.503          -0.2%
    group_add_var             1.22            1.22           +0.0%
    group_add_affine          0.926           0.925          -0.1%
    group_add_affine_var      0.845           0.844          -0.1%
    group_add_zinv_var        0.924           0.922          -0.2%
    group_to_affine_var       2.33            2.33           +0.0%
    ecmult_wnaf               0.731           0.729          -0.3%
    hash_sha256               0.305           0.305          +0.0%
    hash_hmac_sha256          1.21            1.21           +0.0%
    hash_rfc6979_hmac_sha256  6.64            6.64           +0.0%
    context_create            13.4            13.4           +0.0%
    
    mode: minsize, build_type: MinSizeRel, cflags: none
    == minsize before a39093de1534 ==
    == minsize after 1c537ab86814 ==
    Benchmark                 Before min(us)  After min(us)  Delta
    ecdsa_verify              47.4            47.4           +0.0%
    ecdsa_sign                34.4            34.3           -0.3%
    ec_keygen                 24.5            24.5           +0.0%
    ecdh                      51.3            51.7           +0.8%
    schnorrsig_sign           25.9            25.9           +0.0%
    schnorrsig_verify         47.9            47.9           +0.0%
    ellswift_encode           22              22             +0.0%
    ellswift_decode           9.32            9.33           +0.1%
    ellswift_keygen           46.5            46.5           +0.0%
    ellswift_ecdh             55.8            55.9           +0.2%
    field_half                0.00447         0.00447        +0.0%
    field_normalize           0.00985         0.00985        +0.0%
    field_normalize_weak      0.00476         0.00476        +0.0%
    field_sqr                 0.0163          0.0163         +0.0%
    field_mul                 0.0216          0.0217         +0.5%
    field_inverse             2.73            2.73           +0.0%
    field_inverse_var         1.4             1.4            +0.0%
    field_is_square_var       1.83            1.83           +0.0%
    field_sqrt                4.62            4.58           -0.9%
    group_double_var          0.146           0.146          +0.0%
    group_add_var             0.347           0.348          +0.3%
    group_add_affine          0.315           0.314          -0.3%
    group_add_affine_var      0.264           0.264          +0.0%
    group_add_zinv_var        0.284           0.285          +0.4%
    group_to_affine_var       1.52            1.52           +0.0%
    ecmult_wnaf               0.597           0.597          +0.0%
    hash_sha256               0.315           0.315          +0.0%
    hash_hmac_sha256          1.24            1.24           +0.0%
    hash_rfc6979_hmac_sha256  6.83            6.83           +0.0%
    context_create            3.01            3.01           +0.0%
    
    mode: minsize-noinline, build_type: MinSizeRel, cflags: -fno-inline
    == minsize-noinline before a39093de1534 ==
    == minsize-noinline after 1c537ab86814 ==
    Benchmark                 Before min(us)  After min(us)  Delta
    ecdsa_verify              166             166            +0.0%
    ecdsa_sign                72.3            72.3           +0.0%
    ec_keygen                 61.4            61.3           -0.2%
    ecdh                      160             160            +0.0%
    schnorrsig_sign           62.9            62.8           -0.2%
    schnorrsig_verify         167             166            -0.6%
    ellswift_encode           46.7            46.7           +0.0%
    ellswift_decode           25.9            25.9           +0.0%
    ellswift_keygen           108             108            +0.0%
    ellswift_ecdh             166             166            +0.0%
    field_half                0.00419         0.00419        +0.0%
    field_normalize           0.00985         0.00985        +0.0%
    field_normalize_weak      0.00476         0.00476        +0.0%
    field_sqr                 0.0696          0.0688         -1.1%
    field_mul                 0.0887          0.0886         -0.1%
    field_inverse             3.52            3.5            -0.6%
    field_inverse_var         2.15            2.15           +0.0%
    field_is_square_var       2.13            2.13           +0.0%
    field_sqrt                19.1            19.1           +0.0%
    group_double_var          0.566           0.565          -0.2%
    group_add_var             1.37            1.37           +0.0%
    group_add_affine          1.07            1.07           +0.0%
    group_add_affine_var      0.955           0.955          +0.0%
    group_add_zinv_var        1.04            1.04           +0.0%
    group_to_affine_var       2.55            2.55           +0.0%
    ecmult_wnaf               0.773           0.772          -0.1%
    hash_sha256               0.313           0.313          +0.0%
    hash_hmac_sha256          1.25            1.25           +0.0%
    hash_rfc6979_hmac_sha256  6.88            6.88           +0.0%
    context_create            13.5            13.5           +0.0%
    
    mode: minsize-debug, build_type: MinSizeRel, cflags: -D_DEBUG
    == minsize-debug before a39093de1534 ==
    == minsize-debug after 1c537ab86814 ==
    Benchmark                 Before min(us)  After min(us)  Delta
    ecdsa_verify              47.5            47.2           -0.6%
    ecdsa_sign                34.4            34.4           +0.0%
    ec_keygen                 24.5            24.5           +0.0%
    ecdh                      51.5            51.6           +0.2%
    schnorrsig_sign           25.9            25.9           +0.0%
    schnorrsig_verify         47.9            48             +0.2%
    ellswift_encode           22              22             +0.0%
    ellswift_decode           9.32            9.32           +0.0%
    ellswift_keygen           46.5            46.5           +0.0%
    ellswift_ecdh             55.9            55.9           +0.0%
    field_half                0.00447         0.00447        +0.0%
    field_normalize           0.00986         0.00985        -0.1%
    field_normalize_weak      0.00476         0.00476        +0.0%
    field_sqr                 0.0163          0.0163         +0.0%
    field_mul                 0.0216          0.0217         +0.5%
    field_inverse             2.73            2.74           +0.4%
    field_inverse_var         1.4             1.4            +0.0%
    field_is_square_var       1.83            1.83           +0.0%
    field_sqrt                4.62            4.61           -0.2%
    group_double_var          0.146           0.146          +0.0%
    group_add_var             0.348           0.348          +0.0%
    group_add_affine          0.315           0.315          +0.0%
    group_add_affine_var      0.264           0.263          -0.4%
    group_add_zinv_var        0.285           0.285          +0.0%
    group_to_affine_var       1.52            1.52           +0.0%
    ecmult_wnaf               0.596           0.596          +0.0%
    hash_sha256               0.315           0.315          +0.0%
    hash_hmac_sha256          1.24            1.24           +0.0%
    hash_rfc6979_hmac_sha256  6.84            6.83           -0.1%
    context_create            3.01            3.01           +0.0%
    
    mode: minsize-debug-noinline, build_type: MinSizeRel, cflags: -D_DEBUG -fno-inline
    == minsize-debug-noinline before a39093de1534 ==
    == minsize-debug-noinline after 1c537ab86814 ==
    Benchmark                 Before min(us)  After min(us)  Delta
    ecdsa_verify              166             166            +0.0%
    ecdsa_sign                72.3            72.3           +0.0%
    ec_keygen                 61.3            61.3           +0.0%
    ecdh                      160             160            +0.0%
    schnorrsig_sign           62.9            62.8           -0.2%
    schnorrsig_verify         167             166            -0.6%
    ellswift_encode           46.8            46.7           -0.2%
    ellswift_decode           25.9            25.9           +0.0%
    ellswift_keygen           108             108            +0.0%
    ellswift_ecdh             166             166            +0.0%
    field_half                0.00419         0.00419        +0.0%
    field_normalize           0.00985         0.00985        +0.0%
    field_normalize_weak      0.00476         0.00476        +0.0%
    field_sqr                 0.0693          0.0688         -0.7%
    field_mul                 0.0885          0.0884         -0.1%
    field_inverse             3.52            3.45           -2.0%
    field_inverse_var         2.14            2.15           +0.5%
    field_is_square_var       2.13            2.13           +0.0%
    field_sqrt                19.1            19.1           +0.0%
    group_double_var          0.565           0.565          +0.0%
    group_add_var             1.37            1.37           +0.0%
    group_add_affine          1.07            1.07           +0.0%
    group_add_affine_var      0.955           0.955          +0.0%
    group_add_zinv_var        1.04            1.04           +0.0%
    group_to_affine_var       2.55            2.56           +0.4%
    ecmult_wnaf               0.77            0.771          +0.1%
    hash_sha256               0.313           0.313          +0.0%
    hash_hmac_sha256          1.25            1.25           +0.0%
    hash_rfc6979_hmac_sha256  6.88            6.88           +0.0%
    context_create            13.5            13.5           +0.0%
    
    
    
    --------------
    
    compiler: gcc-14 (Homebrew GCC 14.3.0) 14.3.0, host: M4-Max.local
    
    mode: release, build_type: Release, cflags: none
    == gcc-14 release before a39093de1534 ==
    == gcc-14 release after 1c537ab86814 ==
    Side    Commit                 libsecp256k1.a bytes
    before  a39093de1534           1255544
    after   1c537ab86814           1315664
    Delta   +60120 bytes (+4.79%)
    Benchmark                 Before min(us)  After min(us)  Delta
    ecdsa_verify              17.7            16.1           -9.0%
    ecdsa_sign                12.4            12.4           +0.0%
    ec_keygen                 8.15            7.97           -2.2%
    ecdh                      16.7            15.5           -7.2%
    schnorrsig_sign           8.71            8.35           -4.1%
    schnorrsig_verify         17.9            16.6           -7.3%
    ellswift_encode           11.2            11.8           +5.4%
    ellswift_decode           4.69            5.03           +7.2%
    ellswift_keygen           20              19.4           -3.0%
    ellswift_ecdh             19              17.2           -9.5%
    field_half                0.00166         0.00165        -0.6%
    field_normalize           0.00742         0.00732        -1.3%
    field_normalize_weak      0.00323         0.00312        -3.4%
    field_sqr                 0.00905         0.0085         -6.1%
    field_mul                 0.00984         0.00954        -3.0%
    field_inverse             1.62            1.62           +0.0%
    field_inverse_var         0.765           0.771          +0.8%
    field_is_square_var       1.05            1.06           +1.0%
    field_sqrt                2.34            2.31           -1.3%
    group_double_var          0.0506          0.0453         -10.5%
    group_add_var             0.127           0.111          -12.6%
    group_add_affine          0.1             0.0926         -7.4%
    group_add_affine_var      0.0899          0.0775         -13.8%
    group_add_zinv_var        0.107           0.0908         -15.1%
    group_to_affine_var       0.809           0.806          -0.4%
    ecmult_wnaf               0.342           0.344          +0.6%
    hash_sha256               0.121           0.121          +0.0%
    hash_hmac_sha256          0.471           0.47           -0.2%
    hash_rfc6979_hmac_sha256  2.6             2.62           +0.8%
    context_create            2.1             2.11           +0.5%
    
    mode: noinline, build_type: Release, cflags: -fno-inline
    == gcc-14 noinline before a39093de1534 ==
    == gcc-14 noinline after 1c537ab86814 ==
    Side    Commit             libsecp256k1.a bytes
    before  a39093de1534       1254776
    after   1c537ab86814       1254776
    Delta   +0 bytes (+0.00%)
    Benchmark                 Before min(us)  After min(us)  Delta
    ecdsa_verify              105             107            +1.9%
    ecdsa_sign                39.7            40             +0.8%
    ec_keygen                 35              35.1           +0.3%
    ecdh                      93.1            93.2           +0.1%
    schnorrsig_sign           35.4            35.6           +0.6%
    schnorrsig_verify         106             106            +0.0%
    ellswift_encode           34.8            34.8           +0.0%
    ellswift_decode           20.6            20.6           +0.0%
    ellswift_keygen           70.5            70.5           +0.0%
    ellswift_ecdh             96.1            96.1           +0.0%
    field_half                0.00314         0.00314        +0.0%
    field_normalize           0.00729         0.00717        -1.6%
    field_normalize_weak      0.00322         0.00322        +0.0%
    field_sqr                 0.0588          0.0587         -0.2%
    field_mul                 0.0765          0.0765         +0.0%
    field_inverse             2.11            2.1            -0.5%
    field_inverse_var         1.13            1.12           -0.9%
    field_is_square_var       1.29            1.29           +0.0%
    field_sqrt                16              16             +0.0%
    group_double_var          0.323           0.324          +0.3%
    group_add_var             0.857           0.854          -0.4%
    group_add_affine          0.62            0.619          -0.2%
    group_add_affine_var      0.618           0.614          -0.6%
    group_add_zinv_var        0.715           0.714          -0.1%
    group_to_affine_var       1.34            1.34           +0.0%
    ecmult_wnaf               0.45            0.452          +0.4%
    hash_sha256               0.117           0.118          +0.9%
    hash_hmac_sha256          0.463           0.463          +0.0%
    hash_rfc6979_hmac_sha256  2.53            2.54           +0.4%
    context_create            8.34            8.38           +0.5%
    
    mode: debug, build_type: Release, cflags: -D_DEBUG
    == gcc-14 debug before a39093de1534 ==
    == gcc-14 debug after 1c537ab86814 ==
    Side    Commit             libsecp256k1.a bytes
    before  a39093de1534       1255544
    after   1c537ab86814       1255544
    Delta   +0 bytes (+0.00%)
    Benchmark                 Before min(us)  After min(us)  Delta
    ecdsa_verify              17.8            17.6           -1.1%
    ecdsa_sign                12.5            12.4           -0.8%
    ec_keygen                 8.17            8.11           -0.7%
    ecdh                      16.8            16.7           -0.6%
    schnorrsig_sign           8.8             8.67           -1.5%
    schnorrsig_verify         18.1            17.8           -1.7%
    ellswift_encode           11.9            11.6           -2.5%
    ellswift_decode           4.99            4.92           -1.4%
    ellswift_keygen           19.9            19.8           -0.5%
    ellswift_ecdh             18.9            18.8           -0.5%
    field_half                0.00167         0.00166        -0.6%
    field_normalize           0.00733         0.00721        -1.6%
    field_normalize_weak      0.00307         0.00302        -1.6%
    field_sqr                 0.00896         0.00897        +0.1%
    field_mul                 0.00996         0.00997        +0.1%
    field_inverse             1.63            1.62           -0.6%
    field_inverse_var         0.777           0.773          -0.5%
    field_is_square_var       1.07            1.06           -0.9%
    field_sqrt                2.34            2.32           -0.9%
    group_double_var          0.0508          0.0505         -0.6%
    group_add_var             0.128           0.128          +0.0%
    group_add_affine          0.101           0.101          +0.0%
    group_add_affine_var      0.0899          0.0892         -0.8%
    group_add_zinv_var        0.107           0.107          +0.0%
    group_to_affine_var       0.816           0.81           -0.7%
    ecmult_wnaf               0.347           0.342          -1.4%
    hash_sha256               0.122           0.121          -0.8%
    hash_hmac_sha256          0.471           0.468          -0.6%
    hash_rfc6979_hmac_sha256  2.59            2.57           -0.8%
    context_create            2.1             2.07           -1.4%
    
    mode: debug-noinline, build_type: Release, cflags: -D_DEBUG -fno-inline
    == gcc-14 debug-noinline before a39093de1534 ==
    == gcc-14 debug-noinline after 1c537ab86814 ==
    Side    Commit             libsecp256k1.a bytes
    before  a39093de1534       1254776
    after   1c537ab86814       1254776
    Delta   +0 bytes (+0.00%)
    Benchmark                 Before min(us)  After min(us)  Delta
    ecdsa_verify              105             103            -1.9%
    ecdsa_sign                39.6            39.4           -0.5%
    ec_keygen                 34.7            34.4           -0.9%
    ecdh                      92.2            91.2           -1.1%
    schnorrsig_sign           35.3            35             -0.8%
    schnorrsig_verify         105             103            -1.9%
    ellswift_encode           34.3            33.7           -1.7%
    ellswift_decode           20.2            20             -1.0%
    ellswift_keygen           70              69.6           -0.6%
    ellswift_ecdh             96.1            95.5           -0.6%
    field_half                0.0031          0.00308        -0.6%
    field_normalize           0.00709         0.00706        -0.4%
    field_normalize_weak      0.00321         0.00316        -1.6%
    field_sqr                 0.0589          0.0581         -1.4%
    field_mul                 0.0756          0.0745         -1.5%
    field_inverse             2.09            2.09           +0.0%
    field_inverse_var         1.12            1.12           +0.0%
    field_is_square_var       1.29            1.3            +0.8%
    field_sqrt                15.8            16.4           +3.8%
    group_double_var          0.326           0.33           +1.2%
    group_add_var             0.849           0.865          +1.9%
    group_add_affine          0.613           0.621          +1.3%
    group_add_affine_var      0.601           0.612          +1.8%
    group_add_zinv_var        0.693           0.711          +2.6%
    group_to_affine_var       1.32            1.34           +1.5%
    ecmult_wnaf               0.431           0.451          +4.6%
    hash_sha256               0.116           0.116          +0.0%
    hash_hmac_sha256          0.459           0.465          +1.3%
    hash_rfc6979_hmac_sha256  2.51            2.55           +1.6%
    context_create            8.14            8.35           +2.6%
    
    mode: minsize, build_type: MinSizeRel, cflags: none
    == gcc-14 minsize before a39093de1534 ==
    == gcc-14 minsize after 1c537ab86814 ==
    Side    Commit             libsecp256k1.a bytes
    before  a39093de1534       1224504
    after   1c537ab86814       1224504
    Delta   +0 bytes (+0.00%)
    Benchmark                 Before min(us)  After min(us)  Delta
    ecdsa_verify              20.2            20.3           +0.5%
    ecdsa_sign                13.5            13.5           +0.0%
    ec_keygen                 9.09            9.06           -0.3%
    ecdh                      20.5            20.5           +0.0%
    schnorrsig_sign           9.76            9.65           -1.1%
    schnorrsig_verify         20.3            20.3           +0.0%
    ellswift_encode           12.3            12.3           +0.0%
    ellswift_decode           5.45            5.47           +0.4%
    ellswift_keygen           21.7            21.7           +0.0%
    ellswift_ecdh             22.6            22.5           -0.4%
    field_half                0.00342         0.00342        +0.0%
    field_normalize           0.00717         0.0071         -1.0%
    field_normalize_weak      0.00321         0.00323        +0.6%
    field_sqr                 0.00935         0.00919        -1.7%
    field_mul                 0.0104          0.0103         -1.0%
    field_inverse             1.56            1.56           +0.0%
    field_inverse_var         0.791           0.793          +0.3%
    field_is_square_var       1.09            1.08           -0.9%
    field_sqrt                2.56            2.57           +0.4%
    group_double_var          0.0591          0.0595         +0.7%
    group_add_var             0.136           0.136          +0.0%
    group_add_affine          0.116           0.116          +0.0%
    group_add_affine_var      0.098           0.098          +0.0%
    group_add_zinv_var        0.115           0.115          +0.0%
    group_to_affine_var       0.829           0.83           +0.1%
    ecmult_wnaf               0.36            0.363          +0.8%
    hash_sha256               0.124           0.124          +0.0%
    hash_hmac_sha256          0.51            0.51           +0.0%
    hash_rfc6979_hmac_sha256  2.78            2.78           +0.0%
    context_create            2.63            2.64           +0.4%
    
    mode: minsize-noinline, build_type: MinSizeRel, cflags: -fno-inline
    == gcc-14 minsize-noinline before a39093de1534 ==
    == gcc-14 minsize-noinline after 1c537ab86814 ==
    Side    Commit             libsecp256k1.a bytes
    before  a39093de1534       1247200
    after   1c537ab86814       1247200
    Delta   +0 bytes (+0.00%)
    Benchmark                 Before min(us)  After min(us)  Delta
    ecdsa_verify              108             106            -1.9%
    ecdsa_sign                40.8            40.3           -1.2%
    ec_keygen                 35.6            35.1           -1.4%
    ecdh                      96.7            96.2           -0.5%
    schnorrsig_sign           36              35.7           -0.8%
    schnorrsig_verify         107             106            -0.9%
    ellswift_encode           34.3            33.8           -1.5%
    ellswift_decode           20              19.6           -2.0%
    ellswift_keygen           70.1            69.1           -1.4%
    ellswift_ecdh             102             99.1           -2.8%
    field_half                0.00339         0.00327        -3.5%
    field_normalize           0.00727         0.00679        -6.6%
    field_normalize_weak      0.00322         0.0031         -3.7%
    field_sqr                 0.0581          0.056          -3.6%
    field_mul                 0.0751          0.0728         -3.1%
    field_inverse             2.02            1.98           -2.0%
    field_inverse_var         1.11            1.09           -1.8%
    field_is_square_var       1.34            1.29           -3.7%
    field_sqrt                15.6            15.3           -1.9%
    group_double_var          0.338           0.335          -0.9%
    group_add_var             0.856           0.847          -1.1%
    group_add_affine          0.643           0.639          -0.6%
    group_add_affine_var      0.599           0.594          -0.8%
    group_add_zinv_var        0.693           0.686          -1.0%
    group_to_affine_var       1.33            1.33           +0.0%
    ecmult_wnaf               0.423           0.421          -0.5%
    hash_sha256               0.121           0.12           -0.8%
    hash_hmac_sha256          0.501           0.5            -0.2%
    hash_rfc6979_hmac_sha256  2.74            2.74           +0.0%
    context_create            7.99            8.05           +0.8%
    
    mode: minsize-debug, build_type: MinSizeRel, cflags: -D_DEBUG
    == gcc-14 minsize-debug before a39093de1534 ==
    == gcc-14 minsize-debug after 1c537ab86814 ==
    Side    Commit             libsecp256k1.a bytes
    before  a39093de1534       1224504
    after   1c537ab86814       1224504
    Delta   +0 bytes (+0.00%)
    Benchmark                 Before min(us)  After min(us)  Delta
    ecdsa_verify              19.9            19.9           +0.0%
    ecdsa_sign                13.5            13.4           -0.7%
    ec_keygen                 9.03            9.02           -0.1%
    ecdh                      20.3            20.3           +0.0%
    schnorrsig_sign           9.53            9.53           +0.0%
    schnorrsig_verify         20.2            20.1           -0.5%
    ellswift_encode           12.2            12.1           -0.8%
    ellswift_decode           5.37            5.37           +0.0%
    ellswift_keygen           21.5            21.5           +0.0%
    ellswift_ecdh             22.4            22.4           +0.0%
    field_half                0.00337         0.00331        -1.8%
    field_normalize           0.00703         0.00691        -1.7%
    field_normalize_weak      0.00324         0.00313        -3.4%
    field_sqr                 0.00927         0.0092         -0.8%
    field_mul                 0.0103          0.0103         +0.0%
    field_inverse             1.55            1.53           -1.3%
    field_inverse_var         0.778           0.769          -1.2%
    field_is_square_var       1.07            1.05           -1.9%
    field_sqrt                2.55            2.53           -0.8%
    group_double_var          0.0589          0.0587         -0.3%
    group_add_var             0.136           0.135          -0.7%
    group_add_affine          0.115           0.115          +0.0%
    group_add_affine_var      0.0972          0.0968         -0.4%
    group_add_zinv_var        0.114           0.113          -0.9%
    group_to_affine_var       0.814           0.809          -0.6%
    ecmult_wnaf               0.353           0.351          -0.6%
    hash_sha256               0.122           0.123          +0.8%
    hash_hmac_sha256          0.505           0.504          -0.2%
    hash_rfc6979_hmac_sha256  2.76            2.75           -0.4%
    context_create            2.57            2.55           -0.8%
    
    mode: minsize-debug-noinline, build_type: MinSizeRel, cflags: -D_DEBUG -fno-inline
    == gcc-14 minsize-debug-noinline before a39093de1534 ==
    == gcc-14 minsize-debug-noinline after 1c537ab86814 ==
    Side    Commit             libsecp256k1.a bytes
    before  a39093de1534       1247200
    after   1c537ab86814       1247200
    Delta   +0 bytes (+0.00%)
    Benchmark                 Before min(us)  After min(us)  Delta
    ecdsa_verify              106             106            +0.0%
    ecdsa_sign                40.3            40.1           -0.5%
    ec_keygen                 35.2            35.1           -0.3%
    ecdh                      95.9            95.8           -0.1%
    schnorrsig_sign           35.8            35.7           -0.3%
    schnorrsig_verify         106             106            +0.0%
    ellswift_encode           33.4            33.6           +0.6%
    ellswift_decode           19.6            19.6           +0.0%
    ellswift_keygen           69.3            69.1           -0.3%
    ellswift_ecdh             99.3            99.3           +0.0%
    field_half                0.00328         0.00328        +0.0%
    field_normalize           0.00685         0.00682        -0.4%
    field_normalize_weak      0.00308         0.00311        +1.0%
    field_sqr                 0.0571          0.0561         -1.8%
    field_mul                 0.0743          0.0732         -1.5%
    field_inverse             1.99            1.99           +0.0%
    field_inverse_var         1.1             1.09           -0.9%
    field_is_square_var       1.3             1.3            +0.0%
    field_sqrt                15.3            15.3           +0.0%
    group_double_var          0.336           0.336          +0.0%
    group_add_var             0.85            0.848          -0.2%
    group_add_affine          0.641           0.64           -0.2%
    group_add_affine_var      0.594           0.594          +0.0%
    group_add_zinv_var        0.682           0.683          +0.1%
    group_to_affine_var       1.31            1.31           +0.0%
    ecmult_wnaf               0.418           0.418          +0.0%
    hash_sha256               0.12            0.12           +0.0%
    hash_hmac_sha256          0.497           0.498          +0.2%
    hash_rfc6979_hmac_sha256  2.73            2.73           +0.0%
    context_create            7.89            7.94           +0.6%
    

    </details>

    <details><summary>host: M4-Max.local, compiler: gcc-14 (Homebrew GCC 14.3.0) 14.3.0, host: M4-Max.local</summary>

    mode: release, build_type: Release, cflags: none
    == gcc-14 release before a39093de1534 ==
    == gcc-14 release after 1c537ab86814 ==
    Side    Commit                 libsecp256k1.a bytes
    before  a39093de1534           1255544
    after   1c537ab86814           1315664
    Delta   +60120 bytes (+4.79%)
    Benchmark                 Before min(us)  After min(us)  Delta
    ecdsa_verify              17.4            15.5           -10.9%
    ecdsa_sign                12.3            11.7           -4.9%
    ec_keygen                 7.95            7.63           -4.0%
    ecdh                      16.2            14.8           -8.6%
    schnorrsig_sign           8.59            8.15           -5.1%
    schnorrsig_verify         17.3            15.6           -9.8%
    ellswift_encode           10.5            10.8           +2.9%
    ellswift_decode           4.55            4.41           -3.1%
    ellswift_keygen           18.6            18             -3.2%
    ellswift_ecdh             18.1            16.9           -6.6%
    field_half                0.00317         0.00315        -0.6%
    field_normalize           0.0126          0.0126         +0.0%
    field_normalize_weak      0.00499         0.00498        -0.2%
    field_sqr                 0.0138          0.0131         -5.1%
    field_mul                 0.0167          0.0147         -12.0%
    field_inverse             1.98            1.98           +0.0%
    field_inverse_var         0.825           0.823          -0.2%
    field_is_square_var       1.1             1.08           -1.8%
    field_sqrt                2.28            2.26           -0.9%
    group_double_var          0.0462          0.0439         -5.0%
    group_add_var             0.123           0.11           -10.6%
    group_add_affine          0.0997          0.0922         -7.5%
    group_add_affine_var      0.0888          0.0768         -13.5%
    group_add_zinv_var        0.106           0.0899         -15.2%
    group_to_affine_var       0.717           0.696          -2.9%
    ecmult_wnaf               0.264           0.234          -11.4%
    hash_sha256               0.109           0.109          +0.0%
    hash_hmac_sha256          0.445           0.449          +0.9%
    hash_rfc6979_hmac_sha256  2.5             2.3            -8.0%
    context_create            1.88            1.88           +0.0%
    
    mode: noinline, build_type: Release, cflags: -fno-inline
    == gcc-14 noinline before a39093de1534 ==
    == gcc-14 noinline after 1c537ab86814 ==
    Side    Commit             libsecp256k1.a bytes
    before  a39093de1534       1254776
    after   1c537ab86814       1254776
    Delta   +0 bytes (+0.00%)
    Benchmark                 Before min(us)  After min(us)  Delta
    ecdsa_verify              98.9            101            +2.1%
    ecdsa_sign                38              38.8           +2.1%
    ec_keygen                 33.5            34.5           +3.0%
    ecdh                      88              89.6           +1.8%
    schnorrsig_sign           33.7            34.6           +2.7%
    schnorrsig_verify         98.6            103            +4.5%
    ellswift_encode           32.1            32.7           +1.9%
    ellswift_decode           18.8            19.3           +2.7%
    ellswift_keygen           65.6            66.9           +2.0%
    ellswift_ecdh             89.9            92.9           +3.3%
    field_half                0.00567         0.00646        +13.9%
    field_normalize           0.0126          0.0113         -10.3%
    field_normalize_weak      0.00497         0.00497        +0.0%
    field_sqr                 0.0803          0.0759         -5.5%
    field_mul                 0.0946          0.0946         +0.0%
    field_inverse             2.22            2.19           -1.4%
    field_inverse_var         1.1             1.1            +0.0%
    field_is_square_var       1.25            1.25           +0.0%
    field_sqrt                14.5            14.9           +2.8%
    group_double_var          0.292           0.289          -1.0%
    group_add_var             0.799           0.81           +1.4%
    group_add_affine          0.55            0.596          +8.4%
    group_add_affine_var      0.558           0.552          -1.1%
    group_add_zinv_var        0.667           0.652          -2.2%
    group_to_affine_var       1.19            1.29           +8.4%
    ecmult_wnaf               0.335           0.355          +6.0%
    hash_sha256               0.105           0.106          +1.0%
    hash_hmac_sha256          0.442           0.449          +1.6%
    hash_rfc6979_hmac_sha256  2.48            2.51           +1.2%
    context_create            7.54            7.54           +0.0%
    
    mode: debug, build_type: Release, cflags: -D_DEBUG
    == gcc-14 debug before a39093de1534 ==
    == gcc-14 debug after 1c537ab86814 ==
    Side    Commit             libsecp256k1.a bytes
    before  a39093de1534       1255544
    after   1c537ab86814       1255544
    Delta   +0 bytes (+0.00%)
    Benchmark                 Before min(us)  After min(us)  Delta
    ecdsa_verify              18.7            17.5           -6.4%
    ecdsa_sign                12.4            12.4           +0.0%
    ec_keygen                 8.1             8.11           +0.1%
    ecdh                      16.6            16.5           -0.6%
    schnorrsig_sign           8.63            8.56           -0.8%
    schnorrsig_verify         18              17.7           -1.7%
    ellswift_encode           11.2            10.9           -2.7%
    ellswift_decode           4.72            4.73           +0.2%
    ellswift_keygen           19.3            19.2           -0.5%
    ellswift_ecdh             18.6            18.4           -1.1%
    field_half                0.00372         0.00371        -0.3%
    field_normalize           0.0127          0.0113         -11.0%
    field_normalize_weak      0.00498         0.00498        +0.0%
    field_sqr                 0.0152          0.0126         -17.1%
    field_mul                 0.0168          0.0152         -9.5%
    field_inverse             2.01            1.98           -1.5%
    field_inverse_var         0.849           0.821          -3.3%
    field_is_square_var       1.11            1.09           -1.8%
    field_sqrt                2.37            2.33           -1.7%
    group_double_var          0.0501          0.0464         -7.4%
    group_add_var             0.127           0.126          -0.8%
    group_add_affine          0.0948          0.1            +5.5%
    group_add_affine_var      0.0884          0.089          +0.7%
    group_add_zinv_var        0.102           0.107          +4.9%
    group_to_affine_var       0.777           0.731          -5.9%
    ecmult_wnaf               0.293           0.294          +0.3%
    hash_sha256               0.11            0.117          +6.4%
    hash_hmac_sha256          0.473           0.422          -10.8%
    hash_rfc6979_hmac_sha256  2.62            2.41           -8.0%
    context_create            1.94            1.92           -1.0%
    
    mode: debug-noinline, build_type: Release, cflags: -D_DEBUG -fno-inline
    == gcc-14 debug-noinline before a39093de1534 ==
    == gcc-14 debug-noinline after 1c537ab86814 ==
    Side    Commit             libsecp256k1.a bytes
    before  a39093de1534       1254776
    after   1c537ab86814       1254776
    Delta   +0 bytes (+0.00%)
    Benchmark                 Before min(us)  After min(us)  Delta
    ecdsa_verify              107             104            -2.8%
    ecdsa_sign                40.4            39.8           -1.5%
    ec_keygen                 35.3            34.5           -2.3%
    ecdh                      94.2            91             -3.4%
    schnorrsig_sign           36.2            35             -3.3%
    schnorrsig_verify         107             104            -2.8%
    ellswift_encode           35.1            33.5           -4.6%
    ellswift_decode           20.4            19.5           -4.4%
    ellswift_keygen           70.1            68.7           -2.0%
    ellswift_ecdh             96.6            94.3           -2.4%
    field_half                0.0032          0.00617        +92.8%
    field_normalize           0.00746         0.0117         +56.8%
    field_normalize_weak      0.0032          0.00479        +49.7%
    field_sqr                 0.0561          0.0785         +39.9%
    field_mul                 0.0725          0.0945         +30.3%
    field_inverse             2.3             2.22           -3.5%
    field_inverse_var         1.14            1.09           -4.4%
    field_is_square_var       1.27            1.26           -0.8%
    field_sqrt                15.3            15.5           +1.3%
    group_double_var          0.318           0.318          +0.0%
    group_add_var             0.806           0.812          +0.7%
    group_add_affine          0.603           0.599          -0.7%
    group_add_affine_var      0.562           0.589          +4.8%
    group_add_zinv_var        0.693           0.695          +0.3%
    group_to_affine_var       1.31            1.19           -9.2%
    ecmult_wnaf               0.367           0.362          -1.4%
    hash_sha256               0.113           0.108          -4.4%
    hash_hmac_sha256          0.413           0.457          +10.7%
    hash_rfc6979_hmac_sha256  2.5             2.5            +0.0%
    context_create            7.9             7.9            +0.0%
    
    mode: minsize, build_type: MinSizeRel, cflags: none
    == gcc-14 minsize before a39093de1534 ==
    == gcc-14 minsize after 1c537ab86814 ==
    Side    Commit             libsecp256k1.a bytes
    before  a39093de1534       1224504
    after   1c537ab86814       1224504
    Delta   +0 bytes (+0.00%)
    Benchmark                 Before min(us)  After min(us)  Delta
    ecdsa_verify              20              20.2           +1.0%
    ecdsa_sign                13.3            13.5           +1.5%
    ec_keygen                 8.96            9              +0.4%
    ecdh                      20.2            20.3           +0.5%
    schnorrsig_sign           9.51            9.49           -0.2%
    schnorrsig_verify         20.4            19.9           -2.5%
    ellswift_encode           11.9            11.7           -1.7%
    ellswift_decode           5.16            5.37           +4.1%
    ellswift_keygen           21.2            20.9           -1.4%
    ellswift_ecdh             22.2            22.2           +0.0%
    field_half                0.00762         0.0066         -13.4%
    field_normalize           0.0125          0.0114         -8.8%
    field_normalize_weak      0.00499         0.00499        +0.0%
    field_sqr                 0.0143          0.013          -9.1%
    field_mul                 0.0154          0.0154         +0.0%
    field_inverse             1.88            1.79           -4.8%
    field_inverse_var         0.848           0.846          -0.2%
    field_is_square_var       1.12            1.11           -0.9%
    field_sqrt                2.49            2.5            +0.4%
    group_double_var          0.0575          0.0583         +1.4%
    group_add_var             0.134           0.135          +0.7%
    group_add_affine          0.114           0.115          +0.9%
    group_add_affine_var      0.097           0.0943         -2.8%
    group_add_zinv_var        0.114           0.114          +0.0%
    group_to_affine_var       0.785           0.781          -0.5%
    ecmult_wnaf               0.304           0.303          -0.3%
    hash_sha256               0.118           0.12           +1.7%
    hash_hmac_sha256          0.504           0.504          +0.0%
    hash_rfc6979_hmac_sha256  2.56            2.74           +7.0%
    context_create            2.53            2.59           +2.4%
    
    mode: minsize-noinline, build_type: MinSizeRel, cflags: -fno-inline
    == gcc-14 minsize-noinline before a39093de1534 ==
    == gcc-14 minsize-noinline after 1c537ab86814 ==
    Side    Commit             libsecp256k1.a bytes
    before  a39093de1534       1247200
    after   1c537ab86814       1247200
    Delta   +0 bytes (+0.00%)
    Benchmark                 Before min(us)  After min(us)  Delta
    ecdsa_verify              106             106            +0.0%
    ecdsa_sign                40              39.9           -0.3%
    ec_keygen                 34.6            35.1           +1.4%
    ecdh                      96.3            96.5           +0.2%
    schnorrsig_sign           36              36.2           +0.6%
    schnorrsig_verify         107             107            +0.0%
    ellswift_encode           34.3            34.2           -0.3%
    ellswift_decode           20              20             +0.0%
    ellswift_keygen           69.2            69.1           -0.1%
    ellswift_ecdh             99.4            99.6           +0.2%
    field_half                0.00556         0.00657        +18.2%
    field_normalize           0.0097          0.0113         +16.5%
    field_normalize_weak      0.00421         0.00454        +7.8%
    field_sqr                 0.0708          0.0755         +6.6%
    field_mul                 0.0843          0.0928         +10.1%
    field_inverse             2.03            2.11           +3.9%
    field_inverse_var         1.11            1.12           +0.9%
    field_is_square_var       1.36            1.31           -3.7%
    field_sqrt                15.3            15.5           +1.3%
    group_double_var          0.343           0.337          -1.7%
    group_add_var             0.856           0.85           -0.7%
    group_add_affine          0.652           0.634          -2.8%
    group_add_affine_var      0.581           0.602          +3.6%
    group_add_zinv_var        0.689           0.658          -4.5%
    group_to_affine_var       1.34            1.32           -1.5%
    ecmult_wnaf               0.415           0.381          -8.2%
    hash_sha256               0.123           0.119          -3.3%
    hash_hmac_sha256          0.503           0.499          -0.8%
    hash_rfc6979_hmac_sha256  2.76            2.66           -3.6%
    context_create            7.96            7.94           -0.3%
    
    mode: minsize-debug, build_type: MinSizeRel, cflags: -D_DEBUG
    == gcc-14 minsize-debug before a39093de1534 ==
    == gcc-14 minsize-debug after 1c537ab86814 ==
    Side    Commit             libsecp256k1.a bytes
    before  a39093de1534       1224504
    after   1c537ab86814       1224504
    Delta   +0 bytes (+0.00%)
    Benchmark                 Before min(us)  After min(us)  Delta
    ecdsa_verify              19.7            19.8           +0.5%
    ecdsa_sign                13.3            13.4           +0.8%
    ec_keygen                 8.99            9.02           +0.3%
    ecdh                      20.3            20.3           +0.0%
    schnorrsig_sign           9.51            9.6            +0.9%
    schnorrsig_verify         20.1            20             -0.5%
    ellswift_encode           11.9            12.1           +1.7%
    ellswift_decode           5.61            5.39           -3.9%
    ellswift_keygen           21.4            21.2           -0.9%
    ellswift_ecdh             22.4            22.3           -0.4%
    field_half                0.00657         0.00761        +15.8%
    field_normalize           0.0113          0.0122         +8.0%
    field_normalize_weak      0.00456         0.00499        +9.4%
    field_sqr                 0.013           0.0142         +9.2%
    field_mul                 0.0154          0.0154         +0.0%
    field_inverse             1.8             1.88           +4.4%
    field_inverse_var         0.85            0.848          -0.2%
    field_is_square_var       1.08            1.12           +3.7%
    field_sqrt                2.53            2.54           +0.4%
    group_double_var          0.0585          0.0583         -0.3%
    group_add_var             0.135           0.135          +0.0%
    group_add_affine          0.115           0.115          +0.0%
    group_add_affine_var      0.0976          0.0963         -1.3%
    group_add_zinv_var        0.114           0.113          -0.9%
    group_to_affine_var       0.804           0.789          -1.9%
    ecmult_wnaf               0.332           0.257          -22.6%
    hash_sha256               0.124           0.111          -10.5%
    hash_hmac_sha256          0.505           0.496          -1.8%
    hash_rfc6979_hmac_sha256  2.74            2.75           +0.4%
    context_create            2.54            2.62           +3.1%
    
    mode: minsize-debug-noinline, build_type: MinSizeRel, cflags: -D_DEBUG -fno-inline
    == gcc-14 minsize-debug-noinline before a39093de1534 ==
    == gcc-14 minsize-debug-noinline after 1c537ab86814 ==
    Side    Commit             libsecp256k1.a bytes
    before  a39093de1534       1247200
    after   1c537ab86814       1247200
    Delta   +0 bytes (+0.00%)
    Benchmark                 Before min(us)  After min(us)  Delta
    ecdsa_verify              106             106            +0.0%
    ecdsa_sign                40.9            40.4           -1.2%
    ec_keygen                 35.7            35.3           -1.1%
    ecdh                      97.1            96.5           -0.6%
    schnorrsig_sign           36              35.8           -0.6%
    schnorrsig_verify         107             107            +0.0%
    ellswift_encode           34.4            34.1           -0.9%
    ellswift_decode           19.9            19.9           +0.0%
    ellswift_keygen           69.6            69.3           -0.4%
    ellswift_ecdh             99.9            99.9           +0.0%
    field_half                0.00761         0.00657        -13.7%
    field_normalize           0.0126          0.0116         -7.9%
    field_normalize_weak      0.00498         0.00458        -8.0%
    field_sqr                 0.0809          0.0766         -5.3%
    field_mul                 0.0927          0.0929         +0.2%
    field_inverse             2.18            2.16           -0.9%
    field_inverse_var         1.1             1.12           +1.8%
    field_is_square_var       1.31            1.33           +1.5%
    field_sqrt                15.4            15.5           +0.6%
    group_double_var          0.338           0.336          -0.6%
    group_add_var             0.839           0.841          +0.2%
    group_add_affine          0.627           0.636          +1.4%
    group_add_affine_var      0.573           0.602          +5.1%
    group_add_zinv_var        0.675           0.665          -1.5%
    group_to_affine_var       1.33            1.27           -4.5%
    ecmult_wnaf               0.383           0.411          +7.3%
    hash_sha256               0.122           0.124          +1.6%
    hash_hmac_sha256          0.498           0.505          +1.4%
    hash_rfc6979_hmac_sha256  2.7             2.63           -2.6%
    context_create            7.86            7.95           +1.1%
    

    </details>

    <details><summary>host: WIN-A2EHOAU4JET, system: Microsoft Windows NT 10.0.20348.0, compiler: Microsoft (R) C/C++ Optimizing Compiler Version 19.50.35728 for x64</summary>

    mode: release, config: Release, cflags: none, config_cflags: /O2 /Ob2 /DNDEBUG
    == release before a39093de1534 ==
    == release after 1c537ab86814 ==
    Artifact size, Release DLL
    Side     Commit          DLL bytes
    before   a39093de1534      1239552
    after    1c537ab86814      1412096
    Delta                      172544 (+13.92%)
    Benchmark                    Before min(us) After min(us)    Delta
    ecdsa_verify                           74.3          71.7    -3.5%
    ecdsa_sign                             43.3          40.9    -5.5%
    ec_keygen                              31.8          29.3    -7.9%
    ecdh                                   74.3          67.4    -9.3%
    schnorrsig_sign                        33.4          31.6    -5.4%
    schnorrsig_verify                      75.1          72.6    -3.3%
    ellswift_encode                          33          33.3    +0.9%
    ellswift_decode                        14.4          14.8    +2.8%
    ellswift_keygen                        64.3          63.2    -1.7%
    ellswift_ecdh                          79.8          73.1    -8.4%
    field_half                          0.00378       0.00378    +0.0%
    field_normalize                       0.011         0.011    +0.0%
    field_normalize_weak                0.00379       0.00379    +0.0%
    field_sqr                            0.0265        0.0246    -7.2%
    field_mul                            0.0385        0.0359    -6.8%
    field_inverse                          3.23          3.25    +0.6%
    field_inverse_var                      2.05          2.05    +0.0%
    field_is_square_var                    2.71          2.71    +0.0%
    field_sqrt                             7.38           7.1    -3.8%
    group_double_var                      0.239         0.205   -14.2%
    group_add_var                         0.589          0.52   -11.7%
    group_add_affine                      0.458         0.401   -12.4%
    group_add_affine_var                  0.411          0.36   -12.4%
    group_add_zinv_var                    0.449         0.396   -11.8%
    group_to_affine_var                    2.22          2.21    -0.5%
    ecmult_wnaf                            0.57         0.589    +3.3%
    hash_sha256                           0.325         0.325    +0.0%
    hash_hmac_sha256                       1.28          1.27    -0.8%
    hash_rfc6979_hmac_sha256                  7          7.06    +0.9%
    context_create                         3.45          3.44    -0.3%
    
    mode: ob0, config: Release, cflags: /Ob0, config_cflags: /O2 /Ob0 /DNDEBUG
    == ob0 before a39093de1534 ==
    == ob0 after 1c537ab86814 ==
    Artifact size, Release DLL
    Side     Commit          DLL bytes
    before   a39093de1534      1223680
    after    1c537ab86814      1223680
    Delta                           0 (+0.00%)
    Benchmark                    Before min(us) After min(us)    Delta
    ecdsa_verify                            177           177    +0.0%
    ecdsa_sign                             78.1          78.2    +0.1%
    ec_keygen                              65.5          65.5    +0.0%
    ecdh                                    168           168    +0.0%
    schnorrsig_sign                        67.6          67.7    +0.1%
    schnorrsig_verify                       178           177    -0.6%
    ellswift_encode                        55.4          55.5    +0.2%
    ellswift_decode                        29.4            29    -1.4%
    ellswift_keygen                         121           121    +0.0%
    ellswift_ecdh                           175           175    +0.0%
    field_half                          0.00416       0.00416    +0.0%
    field_normalize                       0.011         0.011    +0.0%
    field_normalize_weak                0.00556       0.00557    +0.2%
    field_sqr                            0.0734        0.0734    +0.0%
    field_mul                            0.0892        0.0894    +0.2%
    field_inverse                          4.14          4.14    +0.0%
    field_inverse_var                      2.74          2.74    +0.0%
    field_is_square_var                    3.05          3.05    +0.0%
    field_sqrt                               20            20    +0.0%
    group_double_var                      0.587         0.587    +0.0%
    group_add_var                           1.4           1.4    +0.0%
    group_add_affine                       1.07          1.07    +0.0%
    group_add_affine_var                  0.969         0.969    +0.0%
    group_add_zinv_var                     1.07          1.07    +0.0%
    group_to_affine_var                    3.16          3.16    +0.0%
    ecmult_wnaf                           0.791         0.789    -0.3%
    hash_sha256                           0.337          0.34    +0.9%
    hash_hmac_sha256                       1.34          1.34    +0.0%
    hash_rfc6979_hmac_sha256                7.3           7.3    +0.0%
    context_create                         14.7          14.7    +0.0%
    
    mode: debug, config: Release, cflags: /D_DEBUG, config_cflags: /O2 /Ob2 /DNDEBUG /D_DEBUG
    == debug before a39093de1534 ==
    == debug after 1c537ab86814 ==
    Artifact size, Release DLL
    Side     Commit          DLL bytes
    before   a39093de1534      1239552
    after    1c537ab86814      1239552
    Delta                           0 (+0.00%)
    Benchmark                    Before min(us) After min(us)    Delta
    ecdsa_verify                           74.3          74.1    -0.3%
    ecdsa_sign                             43.2          43.2    +0.0%
    ec_keygen                              31.8          31.8    +0.0%
    ecdh                                   74.3          74.3    +0.0%
    schnorrsig_sign                        33.4          33.4    +0.0%
    schnorrsig_verify                      74.9          74.9    +0.0%
    ellswift_encode                        32.9          32.9    +0.0%
    ellswift_decode                        14.4          14.4    +0.0%
    ellswift_keygen                        64.4          64.2    -0.3%
    ellswift_ecdh                          79.8          79.7    -0.1%
    field_half                          0.00378       0.00378    +0.0%
    field_normalize                       0.011         0.011    +0.0%
    field_normalize_weak                0.00379       0.00379    +0.0%
    field_sqr                            0.0267        0.0265    -0.7%
    field_mul                            0.0385        0.0385    +0.0%
    field_inverse                          3.23          3.24    +0.3%
    field_inverse_var                      2.05          2.05    +0.0%
    field_is_square_var                    2.71          2.71    +0.0%
    field_sqrt                             7.41          7.38    -0.4%
    group_double_var                      0.239         0.239    +0.0%
    group_add_var                         0.589         0.589    +0.0%
    group_add_affine                      0.459         0.458    -0.2%
    group_add_affine_var                  0.412         0.411    -0.2%
    group_add_zinv_var                     0.45         0.449    -0.2%
    group_to_affine_var                    2.22          2.22    +0.0%
    ecmult_wnaf                            0.57         0.569    -0.2%
    hash_sha256                           0.323         0.325    +0.6%
    hash_hmac_sha256                       1.28          1.28    +0.0%
    hash_rfc6979_hmac_sha256               6.98             7    +0.3%
    context_create                         3.44          3.44    +0.0%
    
    mode: debug-ob0, config: Release, cflags: /D_DEBUG /Ob0, config_cflags: /O2 /Ob0 /DNDEBUG /D_DEBUG
    == debug-ob0 before a39093de1534 ==
    == debug-ob0 after 1c537ab86814 ==
    Artifact size, Release DLL
    Side     Commit          DLL bytes
    before   a39093de1534      1223680
    after    1c537ab86814      1223680
    Delta                           0 (+0.00%)
    Benchmark                    Before min(us) After min(us)    Delta
    ecdsa_verify                            176           176    +0.0%
    ecdsa_sign                             78.2          78.4    +0.3%
    ec_keygen                              65.6          65.5    -0.2%
    ecdh                                    168           168    +0.0%
    schnorrsig_sign                        67.7          67.5    -0.3%
    schnorrsig_verify                       177           177    +0.0%
    ellswift_encode                        55.9          55.3    -1.1%
    ellswift_decode                        29.5          29.4    -0.3%
    ellswift_keygen                         121           121    +0.0%
    ellswift_ecdh                           175           175    +0.0%
    field_half                          0.00416       0.00416    +0.0%
    field_normalize                       0.011         0.011    +0.0%
    field_normalize_weak                0.00557       0.00556    -0.2%
    field_sqr                            0.0734        0.0734    +0.0%
    field_mul                            0.0893        0.0894    +0.1%
    field_inverse                          4.14          4.15    +0.2%
    field_inverse_var                      2.74          2.73    -0.4%
    field_is_square_var                    3.05          3.04    -0.3%
    field_sqrt                               20            20    +0.0%
    group_double_var                      0.587         0.587    +0.0%
    group_add_var                           1.4           1.4    +0.0%
    group_add_affine                       1.07          1.07    +0.0%
    group_add_affine_var                   0.97         0.969    -0.1%
    group_add_zinv_var                     1.07          1.07    +0.0%
    group_to_affine_var                    3.16          3.16    +0.0%
    ecmult_wnaf                           0.791         0.791    +0.0%
    hash_sha256                           0.339         0.337    -0.6%
    hash_hmac_sha256                       1.34          1.35    +0.7%
    hash_rfc6979_hmac_sha256                7.3           7.3    +0.0%
    context_create                         14.6          14.7    +0.7%
    
    mode: minsize, config: MinSizeRel, cflags: none, config_cflags: /O1 /Ob1 /DNDEBUG
    == minsize before a39093de1534 ==
    == minsize after 1c537ab86814 ==
    Artifact size, MinSizeRel DLL
    Side     Commit          DLL bytes
    before   a39093de1534      1224192
    after    1c537ab86814      1401856
    Delta                      177664 (+14.51%)
    Benchmark                    Before min(us) After min(us)    Delta
    ecdsa_verify                           76.9          80.8    +5.1%
    ecdsa_sign                             47.4          46.7    -1.5%
    ec_keygen                              36.7          35.4    -3.5%
    ecdh                                   76.6          72.3    -5.6%
    schnorrsig_sign                        37.9          37.1    -2.1%
    schnorrsig_verify                      77.5          81.5    +5.2%
    ellswift_encode                        33.5          38.3   +14.3%
    ellswift_decode                        14.6          17.9   +22.6%
    ellswift_keygen                        69.7          73.5    +5.5%
    ellswift_ecdh                          82.6          78.1    -5.4%
    field_half                           0.0032       0.00319    -0.3%
    field_normalize                      0.0114        0.0114    +0.0%
    field_normalize_weak                0.00556       0.00556    +0.0%
    field_sqr                            0.0272        0.0249    -8.5%
    field_mul                              0.04        0.0378    -5.5%
    field_inverse                          3.27          3.28    +0.3%
    field_inverse_var                      2.03          2.07    +2.0%
    field_is_square_var                    2.81          2.83    +0.7%
    field_sqrt                             7.51          10.2   +35.8%
    group_double_var                      0.247         0.213   -13.8%
    group_add_var                          0.61         0.658    +7.9%
    group_add_affine                      0.472         0.447    -5.3%
    group_add_affine_var                  0.425         0.408    -4.0%
    group_add_zinv_var                    0.464         0.528   +13.8%
    group_to_affine_var                    2.21          2.21    +0.0%
    ecmult_wnaf                           0.664         0.639    -3.8%
    hash_sha256                           0.332         0.332    +0.0%
    hash_hmac_sha256                       1.31          1.31    +0.0%
    hash_rfc6979_hmac_sha256               7.23          7.17    -0.8%
    context_create                         3.74          3.73    -0.3%
    
    mode: minsize-debug, config: MinSizeRel, cflags: /D_DEBUG, config_cflags: /O1 /Ob1 /DNDEBUG /D_DEBUG
    == minsize-debug before a39093de1534 ==
    == minsize-debug after 1c537ab86814 ==
    Artifact size, MinSizeRel DLL
    Side     Commit          DLL bytes
    before   a39093de1534      1224192
    after    1c537ab86814      1224192
    Delta                           0 (+0.00%)
    Benchmark                    Before min(us) After min(us)    Delta
    ecdsa_verify                           76.7            77    +0.4%
    ecdsa_sign                             47.4          47.4    +0.0%
    ec_keygen                              36.6          36.6    +0.0%
    ecdh                                   77.1          76.7    -0.5%
    schnorrsig_sign                          38            38    +0.0%
    schnorrsig_verify                      77.5          77.4    -0.1%
    ellswift_encode                        33.5          33.5    +0.0%
    ellswift_decode                        14.7          14.7    +0.0%
    ellswift_keygen                        69.7          69.7    +0.0%
    ellswift_ecdh                          82.5          82.4    -0.1%
    field_half                           0.0032        0.0032    +0.0%
    field_normalize                      0.0114        0.0114    +0.0%
    field_normalize_weak                0.00556       0.00556    +0.0%
    field_sqr                            0.0272        0.0272    +0.0%
    field_mul                              0.04        0.0401    +0.2%
    field_inverse                          3.27          3.26    -0.3%
    field_inverse_var                      2.03          2.03    +0.0%
    field_is_square_var                    2.81          2.82    +0.4%
    field_sqrt                             7.52          7.52    +0.0%
    group_double_var                      0.248         0.247    -0.4%
    group_add_var                          0.61          0.61    +0.0%
    group_add_affine                      0.473         0.472    -0.2%
    group_add_affine_var                  0.425         0.425    +0.0%
    group_add_zinv_var                    0.464         0.464    +0.0%
    group_to_affine_var                    2.22          2.21    -0.5%
    ecmult_wnaf                           0.654         0.654    +0.0%
    hash_sha256                           0.332         0.332    +0.0%
    hash_hmac_sha256                       1.31          1.31    +0.0%
    hash_rfc6979_hmac_sha256               7.22          7.23    +0.1%
    context_create                         3.74          3.74    +0.0%
    

    </details>


    I also renamed SECP256K1_ALWAYS_INLINE to SECP256K1_FORCE_INLINE, since it is no longer meant to be "always" used in every build mode.

    Would you be interested in looking into this stuff as well?

    Sure, I'll look into this after I finish a few similar commitments on Core.

  8. real-or-random commented at 7:09 AM on June 2, 2026: contributor

    Concept ACK

    That's a very interesting observation. So far, we tried to stay away from guiding the compiler too much, but the ratio of added complexity vs. gains here is pretty good. @l0rinc What I always wanted to try is profile-guided optimizations, e.g., where the profile is generated in a benchmark run that only performs signature verification (this could even be done automatically as part of the build process). I imagine there could be more low-hanging fruits. Would you be interested in looking into this stuff as well?

  9. real-or-random added the label tweak/refactor on Jun 2, 2026
  10. sipa commented at 1:40 PM on June 2, 2026: contributor

    Concept ACK.

    Master:

    Benchmark                     ,    Min(us)    ,    Avg(us)    ,    Max(us)    
    
    ecdsa_verify                  ,    30.8       ,    31.1       ,    33.4    
    ecdsa_sign                    ,    18.7       ,    18.7       ,    18.7    
    ec_keygen                     ,    13.6       ,    13.6       ,    13.6    
    ecdh                          ,    29.8       ,    29.9       ,    29.9    
    ecdsa_recover                 ,    31.0       ,    32.3       ,    34.4    
    schnorrsig_sign               ,    14.4       ,    14.4       ,    14.4    
    schnorrsig_verify             ,    31.1       ,    31.1       ,    31.2    
    ellswift_encode               ,    13.2       ,    13.2       ,    13.3    
    ellswift_decode               ,     5.79      ,     5.80      ,     5.82   
    ellswift_keygen               ,    26.8       ,    26.8       ,    26.8    
    ellswift_ecdh                 ,    32.1       ,    32.1       ,    32.2    
    

    This PR:

    Benchmark                     ,    Min(us)    ,    Avg(us)    ,    Max(us)    
    
    ecdsa_verify                  ,    27.3       ,    28.2       ,    30.3    
    ecdsa_sign                    ,    17.2       ,    17.9       ,    19.4    
    ec_keygen                     ,    12.2       ,    12.3       ,    12.3    
    ecdh                          ,    26.7       ,    26.8       ,    26.8    
    ecdsa_recover                 ,    28.2       ,    28.2       ,    28.3    
    schnorrsig_sign               ,    13.0       ,    13.4       ,    14.9    
    schnorrsig_verify             ,    28.5       ,    28.7       ,    28.8    
    ellswift_encode               ,    13.4       ,    13.5       ,    13.5    
    ellswift_decode               ,     5.84      ,     5.87      ,     5.91   
    ellswift_keygen               ,    25.7       ,    25.9       ,    26.2    
    ellswift_ecdh                 ,    29.6       ,    29.6       ,    29.9    
    

    (GCC 15.2.0 on Ryzen 5950X)

  11. l0rinc force-pushed on Jun 3, 2026
  12. real-or-random approved
  13. real-or-random commented at 8:07 AM on June 9, 2026: contributor

    utACK 1c537ab86814be2ec795af6311d164415d0f8f2e

  14. hebasto commented at 4:17 PM on June 13, 2026: member

    Concept ACK.

  15. in src/util.h:60 in 1c537ab868 outdated
      56 | @@ -57,6 +57,17 @@ static void print_buf_plain(const unsigned char *buf, size_t len) {
      57 |  #  define SECP256K1_INLINE inline
      58 |  # endif
      59 |  
      60 | +# if !defined(_DEBUG) && !defined(__NO_INLINE__) && !defined(__OPTIMIZE_SIZE__)
    


    hebasto commented at 6:00 PM on June 13, 2026:

    Because Microsoft's cl.exe defines neither the __OPTIMIZE_SIZE__ nor the __OPTIMIZE__ macro, building with cmake --build build --config MinSizeRel will still result in __forceinline being used.


    l0rinc commented at 6:03 PM on June 13, 2026:

    Yes, see #1859 (review)

    Do you think we should change anything here?


    hebasto commented at 6:19 PM on June 13, 2026:

    We could manually define __OPTIMIZE_SIZE__ for the "MinSizeRel" configuration on Windows in the build system. It's not a huge deal, though, since we recommend using clang-cl.exe for Windows builds anyway.


    real-or-random commented at 1:06 PM on June 15, 2026:

    We could manually define __OPTIMIZE_SIZE__ for the "MinSizeRel" configuration on Windows in the build system. It's not a huge deal, though, since we recommend using clang-cl.exe for Windows builds anyway.

    I think defining it in the build system is slightly better than not doing it (if it comes with an appropriate comment). But I agree, it's not a big deal.

  16. hebasto commented at 6:05 PM on June 13, 2026: member

    The Bitcoin Core project has a similar macro named ALWAYS_INLINE. Could we adopt SECP256K1_ALWAYS_INLINE here for consistency across the two closely related projects?

  17. field: force-inline 5x52 mul and sqr
    The 5x52 field multiplication and squaring routines are hot in group arithmetic and scalar multiplication.
    
    Use the new `SECP256K1_FORCE_INLINE` for the thin wrappers and `int128` inner helpers so compilers can schedule the 64x64->128 arithmetic without a call boundary.
    
    Across the measured GCC and MSVC Release builds, this improves ECDSA verification by 0.6% to 9.1%, ECDH by 0.7% to 9.3%, and Schnorr verification by 0.6% to 9.6%.
    
    The direct field benchmarks generally show the intended effect on field squaring and multiplication, while Clang results are mostly flat and less consistently positive.
    
    This is a code-size tradeoff: the tested static library builds grew by about 4.6% to 4.7%, and the tested Windows Release DLL grew by 14.1%.
    
    Co-authored-by: Sebastian Falbesoner <sebastian.falbesoner@gmail.com>
    Co-authored-by: Hennadii Stepanov <32963518+hebasto@users.noreply.github.com>
    Co-authored-by: Tim Ruffing <crypto@timruffing.de>
    71fcd8410e
  18. in src/util.h:61 in 1c537ab868
      56 | @@ -57,6 +57,17 @@ static void print_buf_plain(const unsigned char *buf, size_t len) {
      57 |  #  define SECP256K1_INLINE inline
      58 |  # endif
      59 |  
      60 | +# if !defined(_DEBUG) && !defined(__NO_INLINE__) && !defined(__OPTIMIZE_SIZE__)
      61 | +#  if defined(_MSC_VER)
    


    hebasto commented at 6:14 PM on June 13, 2026:

    Slightly unrelated (?) to this specific change:

    On Windows "Release" builds, both cl.exe and clang-cl.exe hit this branch. However, for the SECP256K1_INLINE macro above, cl.exe uses the Microsoft-specific __inline while clang-cl.exe uses the standard inline.

    We should probably make clang-cl.exe handle SECP256K1_INLINE and SECP256K1_FORCE_INLINE consistently, choosing either the MSVC extensions or the standard keywords for both.

  19. l0rinc force-pushed on Jun 15, 2026
  20. l0rinc commented at 10:10 PM on June 15, 2026: contributor

    Thank you for the comments, rebased and applied the suggestions. The follow-up changes should not affect Linux/macOS GCC or normal Clang benchmark behavior.

    The force-inline selection now mirrors SECP256K1_INLINE by checking the GCC/Clang-compatible path before the _MSC_VER path, so clang-cl uses the same inline + always_inline spelling family as normal Clang instead of falling through to __forceinline. The only behavior that needs fresh validation is Windows, especially clang-cl Release and the MSVC/clang-cl MinSizeRel fallback.

  21. real-or-random approved
  22. real-or-random commented at 8:11 AM on June 16, 2026: contributor

    utACK 71fcd8410e92adbffe33c6633f60153b4d562f43

  23. theStack approved
  24. theStack commented at 1:54 PM on June 16, 2026: contributor

    ACK 71fcd8410e92adbffe33c6633f60153b4d562f43

    Tested again both on arm64 and x86_64 machines with gcc 14.2.0 and clang 20.1.2 each and can confirm the claims in the commit body, i.e. significant signature verification speedups on gcc, and no notable change in performance when using clang (but it's not getting worse). Didn't test using Windows/MSVC.

  25. real-or-random commented at 3:00 PM on June 16, 2026: contributor

    The only behavior that needs fresh validation is Windows, especially clang-cl Release and the MSVC/clang-cl MinSizeRel fallback. @hebasto Want to test this? :)

  26. hebasto commented at 9:03 AM on June 17, 2026: member

    Inlining also increases code size: Platform Artifact Before After Delta macOS GCC libsecp256k1.a 1,254,320 1,311,368 +57,048 (+4.55%) Linux GCC libsecp256k1.a 1,271,040 1,330,808 +59,768 (+4.70%) Windows MSVC Release libsecp256k1-*.dll 1,239,040 1,414,144 +175,104 (+14.13%)

    On my machine, using GCC 16.1.1, the size increase for the shared library is much more significant: over 51%:

    $ ls -l master/lib/libsecp256k1.so.6.0.2 
    -rwxr-xr-x. 1 hebasto hebasto 2481944 Jun 17 09:53 master/lib/libsecp256k1.so.6.0.2
    $ ls -l pr/lib/libsecp256k1.so.6.0.2
    -rwxr-xr-x. 1 hebasto hebasto 3758664 Jun 17 09:56 pr/lib/libsecp256k1.so.6.0.2
    

    Given this, I wouldn't expect such a significant trade-off to be accepted lightly.

  27. theStack commented at 9:38 AM on June 17, 2026: contributor

    @hebasto: Is this build including debug symbols? IIRC I once saw increases in the same ballpark, and it turned out that I built with RelWithDebInfo instead of Release.

  28. hebasto commented at 9:42 AM on June 17, 2026: member

    @hebasto: Is this build including debug symbols? IIRC I once saw increases in the same ballpark, and it turned out that I built with RelWithDebInfo instead of Release.

    Yes, with debug info. However, this is the default configuration for Autotools:

    $ file .libs/libsecp256k1.so.6.0.2 
    .libs/libsecp256k1.so.6.0.2: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, BuildID[sha1]=d55d08d2b5705285ecde8dbfc2735b35d0b64ccd, with debug_info, not stripped
    
  29. l0rinc commented at 9:48 AM on June 17, 2026: contributor

    Yes, with debug info. However, this is the default configuration for Autotools

    1.3 MB of extra debug info still seems tiny to me, especially since the release binary diff is an order of magnitude less. Is there any scenario here that I'm not taking into consideration, is the debug info size something that we care about?

  30. hebasto commented at 10:07 AM on June 17, 2026: member

    It's only 7% for the "Release" configuration on my machine:

    $ ls -l build-multi-master/lib/Release/libsecp256k1.so.6.0.2
    -rwxr-xr-x. 1 hebasto hebasto 1330248 Jun 17 11:00 build-multi-master/lib/Release/libsecp256k1.so.6.0.2
    $ ls -l build-multi-pr/lib/Release/libsecp256k1.so.6.0.2
    -rwxr-xr-x. 1 hebasto hebasto 1420184 Jun 17 10:58 build-multi-pr/lib/Release/libsecp256k1.so.6.0.2
    
    $ ls -l build-multi-master/lib/RelWithDebInfo/libsecp256k1.so.6.0.2
    -rwxr-xr-x. 1 hebasto hebasto 2481952 Jun 17 11:00 build-multi-master/lib/RelWithDebInfo/libsecp256k1.so.6.0.2
    $ ls -l build-multi-pr/lib/RelWithDebInfo/libsecp256k1.so.6.0.2
    -rwxr-xr-x. 1 hebasto hebasto 3758664 Jun 17 10:58 build-multi-pr/lib/RelWithDebInfo/libsecp256k1.so.6.0.2
    
    $ ls -l build-multi-master/lib/Debug/libsecp256k1.so.6.0.2
    -rwxr-xr-x. 1 hebasto hebasto 1420568 Jun 17 11:00 build-multi-master/lib/Debug/libsecp256k1.so.6.0.2
    $ ls -l build-multi-pr/lib/Debug/libsecp256k1.so.6.0.2
    -rwxr-xr-x. 1 hebasto hebasto 1420568 Jun 17 10:58 build-multi-pr/lib/Debug/libsecp256k1.so.6.0.2
    
    $ ls -l build-multi-master/lib/MinSizeRel/libsecp256k1.so.6.0.2
    -rwxr-xr-x. 1 hebasto hebasto 1246856 Jun 17 11:01 build-multi-master/lib/MinSizeRel/libsecp256k1.so.6.0.2
    $ ls -l build-multi-pr/lib/MinSizeRel/libsecp256k1.so.6.0.2
    -rwxr-xr-x. 1 hebasto hebasto 1246856 Jun 17 10:58 build-multi-pr/lib/MinSizeRel/libsecp256k1.so.6.0.2
    

    Seems fine.

  31. real-or-random commented at 11:09 AM on June 17, 2026: contributor

    is the debug info size something that we care about?

    We encourage always building with debug info, and so, yes, this is something we care about a little bit. But the size is not crazy here, even if it's ~50% larger.

    User who care about binary size will probably want to turn off debug info (and if they use -Os, they won't run into the issue in the first place).

  32. hebasto commented at 11:30 AM on June 17, 2026: member

    ACK 71fcd8410e92adbffe33c6633f60153b4d562f43, tested different scenarios on Linux and Windows.

    Here are benchmark results for Clang 22.1.3 on Windows 11 Pro 25H2:

    1> .\build-master\bin\Release\bench.exe
    Benchmark                     ,    Min(us)    ,    Avg(us)    ,    Max(us)
    
    ecdsa_verify                  ,    20.3       ,    20.9       ,    22.5
    ecdsa_sign                    ,    10.8       ,    11.7       ,    12.5
    ec_keygen                     ,     7.71      ,     7.78      ,     8.09
    ecdh                          ,    18.0       ,    18.2       ,    18.5
    schnorrsig_sign               ,     7.62      ,     8.10      ,     8.57
    schnorrsig_verify             ,    16.6       ,    17.0       ,    17.4
    ellswift_encode               ,     7.91      ,     8.05      ,     8.40
    ellswift_decode               ,     3.46      ,     3.48      ,     3.61
    ellswift_keygen               ,    16.4       ,    16.7       ,    17.5
    ellswift_ecdh                 ,    19.1       ,    19.6       ,    20.2
    
    > .\build-pr\bin\Release\bench.exe
    Benchmark                     ,    Min(us)    ,    Avg(us)    ,    Max(us)
    
    ecdsa_verify                  ,    20.0       ,    20.4       ,    21.6
    ecdsa_sign                    ,    10.5       ,    10.6       ,    11.4
    ec_keygen                     ,     7.72      ,     7.78      ,     8.03
    ecdh                          ,    17.3       ,    17.4       ,    17.7
    schnorrsig_sign               ,     7.47      ,     7.53      ,     7.95
    schnorrsig_verify             ,    16.7       ,    16.8       ,    17.1
    ellswift_encode               ,     7.90      ,     8.00      ,     8.70
    ellswift_decode               ,     3.80      ,     3.81      ,     3.84
    ellswift_keygen               ,    16.4       ,    16.5       ,    16.9
    ellswift_ecdh                 ,    18.8       ,    19.4       ,    20.9
    
  33. hebasto approved
  34. real-or-random merged this on Jun 17, 2026
  35. real-or-random closed this on Jun 17, 2026

  36. l0rinc deleted the branch on Jun 17, 2026
  37. l0rinc commented at 11:44 AM on June 17, 2026: contributor

    Thank you for the reviews!


github-metadata-mirror

This is a metadata mirror of the GitHub repository bitcoin-core/secp256k1. This site is not affiliated with GitHub. Content is generated from a GitHub metadata backup.
generated: 2026-06-21 00:15 UTC

This site is hosted by @0xB10C
More mirrored repositories can be found on mirror.b10c.me