For repeated calls to FindMinimum for the same unconstrained problem from different starting points, a speed increase can be obtained by compiling the objective function and its gradient, setting EvaluateSymbolically -> False as a Runtime option for the compilation of the objective function.
Function To Be Minimized:
In[1]:= expr = E^Sin[50 x] + Sin[60 E^y] + Sin[70 Sin[x]] + Sin[Sin[80 y]] -
Sin[10 (x + y)] + 1/4 (x^2 + y^2);
Function to generate n random points with x and y between -3 and 3
In[2]:= genrands[n_] :=
Block[{}, SeedRandom[0]; Transpose[RandomReal[#, n] & /@ {{-3, 3}, {-3, 3}}]]
Repeated FindMinimum Search
In[3]:= Off[FindMinimum::lstol, FindMinimum::sdprec]
In[4]:= opt1[n_] := Sort[FindMinimum[expr, Thread[{{x, y}, #}]] & /@ genrands[n]][[1]]
In[5]:= AbsoluteTiming @ opt1[ 3 10^3]
Out[5]= {2.21029, {-3.30687, {x -> -0.0244031, y -> 0.210612}}}
Compile the objective function
In[6]:= cexpr = Compile[{x, y}, Evaluate[expr],
RuntimeOptions -> {"EvaluateSymbolically" -> False}];
Compile the gradient of the objective function
In[7]:= dexpr = D[expr, {{x, y}}];
In[8]:= cdexpr = Compile[{x, y}, Evaluate[dexpr]];
In[9]:= opt2[n_] := Sort[
FindMinimum[cexpr[x, y], Thread[{{x, y}, #}], Gradient :> cdexpr[x, y]] & /@
genrands[n]][[1]]
In[10]:= AbsoluteTiming[opt2[3 10^3]]
Out[10]= {1.2983, {-3.30687, {x -> -0.0244031, y -> 0.210612}}}