In secp256k1_silentpayments_sender_create_outputs, output keys are generated by calling secp256k1_eckey_pubkey_tweak_add. That helper delegates to secp256k1_ecmult, executing full Straus W-NAF scalar multiplication with GLV decomposition and up to 129 point doublings per output, even though ctx->ecmult_gen_ctx is already validated on entry.
Switching to secp256k1_ecmult_gen_gej evaluates t_k * G from the precomputed generator table and adds B_spend with a single mixed addition (secp256k1_gej_add_ge). Jacobian coordinates are converted back to affine in constant time via secp256k1_ge_set_gej, eliminating point doublings across all sending scenarios.
The first commit introduces sender benchmarks to bench.c for N = 1, 2, 5, 10, 100 outputs with distinct and shared scan keys. The second commit applies the generator table optimization.
Against the first commit baseline, the generator table yields roughly 7 to 10% speedup for single outputs, 8 to 13% for multiple outputs with distinct scan keys, and 11 to 21% when outputs share a scan key.