You can try to use NDSolve instead. But without an example, hard to say, so I made up an example. Lets say your complicated function is
myComplicatedFunction[t_] := t
The following will do repeated NIntegration on the sampling points, just to show that we get same result with NDSolve
pts = Reap[
NIntegrate[myComplicatedFunction[t], {t, -3, 5},
EvaluationMonitor :> Sow[t]]][[2, 1]];
data = {#, NIntegrate[myComplicatedFunction[t], {t, -3, #}]} & /@ pts;
ListStepPlot[data, Mesh -> All, AxesLabel -> {"t", "Area under the curve"},
GridLines -> Automatic, GridLinesStyle -> LightGray,
PlotStyle -> Blue, MeshStyle -> Red]

Now using NDSolve
sol = First@
NDSolve[{f'[t] == myComplicatedFunction[t], f[-3] == 0}, f, {t, -3, 5}];
data = {#, Evaluate[f[#] /. sol]} & /@ pts;
Plotting the data above gives same plot as above, which is the value of the integral at each sample point. I think using NDSolve and evaluating the solution at the sampling point is more efficient than integrating repeatedly for different ranges.