# why Findroot slower with jacobian?

can someone please tell me why findroot performs poorly with jacobian ? in this example res1 is slower than res.

Clear[eqs, vars, function, jx, f, f1, res, res1]
eqs = {x^x + y^y - 20., x + y - 4.};
vars = {x, y};
function = Cases[Compile[##] &[vars, eqs], x_Function :> x] // First;

ClearAll[J];
J[HoldPattern[Function[vars : {__Symbol}, body_]]] :=
Block[vars, Function @@ {vars, D[body, {vars}]}];
jx = N@J[function];
With[{code = jx[x, y]},
cDf = Compile[{{x, _Real}, {y, _Real}}, code,
RuntimeAttributes -> {Listable}, Parallelization -> True,
RuntimeOptions -> "Speed"]];
f[x0_?NumericQ, y0_?NumericQ] :=
FindRoot[{eqs[[1]] == 0, eqs[[2]] == 0}, {x, x0}, {y, y0},
MaxIterations -> 5000,
Jacobian -> {"FiniteDifference", DifferenceOrder -> 1},
AccuracyGoal -> 10];
f1[x0_?NumericQ, y0_?NumericQ] :=
FindRoot[{eqs[[1]] == 0, eqs[[2]] == 0}, {x, x0}, {y, y0},
MaxIterations -> 5000, Jacobian :> cDf[x0, y0], AccuracyGoal -> 10];
res = f[3., 2.] // RepeatedTiming
res1 = f1[3., 2.] // RepeatedTiming

• I gues, the amount of numbercrunching within cDf is not enough to ammortized the calling overhead. This problem is just too small. – Henrik Schumacher Jun 18 '18 at 12:34
• You get some improvement by updating the Jacobian at each step, instead of using the constant Jac. at the starting point {x0, y0} (i.e., use Jacobian :> cDf[x, y]). – Michael E2 Jun 18 '18 at 17:32
• @ Michael E2 it actually makes a difference and you are right i dont even know why i was evaluating Jacobian at initial points. now i have another question. if function and Jacobian being updated at each loop then what is the best way to tackle this problem? you can also post the answer and i will accept it . – user49047 Jun 18 '18 at 18:09

I guess, the amount of number crunching within cDf is not enough to ammortize the calling overhead. This problem is just too small.