How to speedup the plotting time of a multidimensional PDF?

Dear RooFitters,
I have a multidimensional PDF(mass,delta_mass,time,tag) made of 4 components (signal + 3 backgrounds)
that I use to fit my data to measure the B0d mixing frequency.

I used a binned fit and even it the pdf performs a numerical integration, I can fit my data sample in a reasonable time using a binned fit,

But the plotting time of the PDF and its partial components takes unreasonable amount of time (Order of 1hour), expecially while producing the plots on time (=integrating over tag, mass and delta_mass) for the partial components… and I if I request to plot in subranges of my phase-space (using CutRange for data or ProjectionRange for pdf it takes even longer)

Can you give to me some suggestions on how to speed up the process?
Thanks
Stefania

Here is how I plot (this method is generic, for any plots I build, on mass, or delta_mass or time)

void plot(RooPlot *p, RooAbsData& data, RooAddPdf& pdf,
TString range="",
TString binning="",
int opt=0 ){
//=========================================================================================
gROOT->SetStyle(“Plain”);
p->Clear();

RooCmdArg a1(RooCmdArg::none()); // dati colore pallino
RooCmdArg a2(RooCmdArg::none()); // dati colore histogramma
RooCmdArg a3(LineWidth(2)); // linea del fit
RooCmdArg a4(RooCmdArg::none()); // linea delle componenti dei fit
RooCmdArg a5(RooCmdArg::none()); // colore fit
RooCmdArg a6(RooCmdArg::none());
RooCmdArg a7(RooCmdArg::none());
RooCmdArg a8(Binning(binning));
TStopwatch CPUtime;

RooCmdArg cutRange(RooCmdArg::none()); if (range!="" && range!= “FULLSAMPLE”) cutRange = CutRange(range);
RooCmdArg projRange(RooCmdArg::none()); if (range!="" && range!= “FULLSAMPLE”) projRange = ProjectionRange(range);

//The argument style is one of: 1=solid, 2=dash, 3=dash-dot, 4=dot-dot.

TString comb, D0fB, sig, Bplus;
comb = TString(“comb”);
D0fB = TString(“D0fB”);
sig = TString(“sig”);
Bplus= TString(“Bplus”);

RooAbsPdf pdf_sig(0),pdf_comb(0),pdf_D0fB(0),pdf_Bplus(0);
if( pdf.pdfList().selectByName(“sig”)) pdf_sig = (RooAbsPdf
) pdf.pdfList().selectByName(“sig”)->first();
if( pdf.pdfList().selectByName(“comb”)) pdf_comb = (RooAbsPdf
) pdf.pdfList().selectByName(“comb”)->first();
if( pdf.pdfList().selectByName(“D0fB”)) pdf_D0fB = (RooAbsPdf
) pdf.pdfList().selectByName(“D0fB”)->first();
if( pdf.pdfList().selectByName(“Bplus”)) pdf_Bplus = (RooAbsPdf
) pdf.pdfList().selectByName(“Bplus”)->first();
cout<<"====== Start plot "<<endl;
pdf.pdfList().Print(“V”);

cout<<" pdf =========== “<<pdf_sig<<” “<<pdf_comb<<” “<<pdf_D0fB<<” "<<pdf_Bplus<<endl;

cout<<" Projecting data … in “<<range<<endl;
CPUtime.Start();
data.plotOn(p,a1,a2,a8,cutRange);
CPUtime.Stop();
cout<<” time = “<<CPUtime.RealTime()/60.<<endl;
CPUtime.Start();
cout<<” Projecting PDF … in "<<range<<endl;
pdf.plotOn(p,a3,a5,NumCPU(nbcpu),RooFit::Precision(-1));

CPUtime.Stop();
cout<<" time = “<<CPUtime.RealTime()/60.<<endl;
CPUtime.Start();
cout<<” Projecting comb PDF … “<<endl;
if(pdf_comb) pdf_comb->plotOn(p,a3,a4,LineColor(kMagenta),NumCPU(nbcpu),RooFit::Precision(-1));
CPUtime.Stop();
cout<<” time = "<<CPUtime.RealTime()/60.<<endl;

CPUtime.Start();
cout<<" Projecting D0fB PDF … “<<endl;
if(pdf_D0fB) pdf_D0fB->plotOn(p,a3,a6,LineColor(kGray), NumCPU(nbcpu),RooFit::Precision(-1));
CPUtime.Stop();
cout<<” time = "<<CPUtime.RealTime()/60.<<endl;

CPUtime.Start();
cout<<" Projecting sig PDF … “<<endl;
if(pdf_sig) pdf_sig->plotOn(p,a3,a4, LineColor(kRed), NumCPU(nbcpu),RooFit::Precision(-1));
CPUtime.Stop();
cout<<” time = "<<CPUtime.RealTime()/60.<<endl;

CPUtime.Start();
cout<<" Projecting Bplus PDF … “<<endl;
if(pdf_Bplus) pdf_Bplus->plotOn(p,a3,a7,LineColor(kGreen), NumCPU(nbcpu),RooFit::Precision(-1));
CPUtime.Stop();
cout<<” time = "<<CPUtime.RealTime()/60.<<endl;

return;

}