• Paul Eggert's avatar
    Speed up (+ 2 2) by a factor of 10 · fe042e9d
    Paul Eggert authored
    Improve arithmetic performance by avoiding bignums until needed.
    Also, simplify bignum memory management, fixing some unlikely leaks.
    This patch improved the performance of (+ 2 2) by a factor of ten
    on a simple microbenchmark computing (+ x 2), byte-compiled,
    with x a local variable initialized to 2 via means the byte
    compiler could not predict: performance improved from 135 to 13 ns.
    The platform was Fedora 28 x86-64, AMD Phenom II X4 910e.
    Performance also improved 0.6% on ‘make compile-always’.
    * src/bignum.c (init_bignum_once): New function.
    * src/emacs.c (main): Use it.
    * src/bignum.c (mpz): New global var.
    (make_integer_mpz): Rename from make_integer.  All uses changed.
    * src/bignum.c (double_to_bignum, make_bignum_bits)
    (make_bignum, make_bigint, make_biguint, make_integer_mpz):
    * src/data.c (bignum_arith_driver, Frem, Flogcount, Fash)
    (expt_integer, Fadd1, Fsub1, Flognot):
    * src/floatfns.c (Fabs, rounding_driver, rounddiv_q):
    * src/fns.c (Fnthcdr):
    Use mpz rather than mpz_initting and mpz_clearing private
    temporaries.
    * src/bignum.h (bignum_integer): New function.
    * src/data.c (Frem, Fmod, Fash, expt_integer):
    * src/floatfns.c (rounding_driver):
    Use it to simplify code.
    * src/data.c (FIXNUMS_FIT_IN_LONG, free_mpz_value):
    Remove.  All uses removed.
    (floating_point_op): New function.
    (floatop_arith_driver): New function, with much of the guts
    of the old float_arith_driver.
    (float_arith_driver): Use it.
    (floatop_arith_driver, arith_driver):
    Simplify by assuming NARGS is at least 2.
    All callers changed.
    (float_arith_driver):
    New arg, containing the partly converted value of the next arg.
    Reorder args for consistency.  All uses changed.
    (bignum_arith_driver): New function.
    (arith_driver): Use it.  Do fixnum-only integer calculations
    in intmax_t instead of mpz_t, when they fit.
    Break out mpz_t calculations into bignum_arith_driver.
    (Fquo): Use floatop_arith_driver instead of float_arith_driver,
    since the op is known to be valid.
    (Flogcount, Fash): Simplify by coalescing bignum and fixnum code.
    (Fadd1, Fsub1): Simplify by using make_int.
    fe042e9d
bignum.h 2.15 KB