In secp256k1_silentpayments_sender_create_outputs, output keys are currently generated by calling secp256k1_eckey_pubkey_tweak_add. That helper delegates to secp256k1_ecmult, which does a full Straus W-NAF scalar multiplication with GLV decomposition and up to 129 point doublings per output, followed by an immediate modular inversion in secp256k1_ge_set_gej.
Because ctx->ecmult_gen_ctx is already validated on entry, we can compute t_k * G with secp256k1_ecmult_gen_gej from the generator table and add B_spend with a single mixed addition (secp256k1_gej_add_ge). This drops all point doublings from the tweak calculation.
To avoid the individual field inversions, we collect the Jacobian points in batches of up to 16 outputs and convert them simultaneously via Montgomery batch inversion (secp256k1_ge_set_all_gej_var), like we already do for label candidates in the scanning path. This cuts modular inversions down to one per 16 outputs.
Passes all BIP-352 test vectors and existing tests. In local benchmarks, this reduces runtime by roughly 12% to 23% depending on output batch size.