/// \file /// \ingroup tutorial_math /// \notebook -nodraw /// Performance test of all the ROOT random generator (TRandom, TRandom1, TRandom2 and TRandom3) /// Tests the generator TRandom3 against some ref values /// and creates a timing table against TRandom, TRandom1 and TRandom2. /// /// E.g. on an an Intel Xeon Quad-core Harpertown (E5410) 2.33 GHz running /// Linux SLC4 64 bit and compiled with gcc 3.4 /// /// ~~~ /// Distribution nanoseconds/call /// TRandom TRandom1 TRandom2 TRandom3 /// Rndm.............. 5.000 105.000 7.000 10.000 /// RndmArray......... 4.000 104.000 6.000 9.000 /// Gaus.............. 36.000 180.000 40.000 48.000 /// Rannor............ 118.000 220.000 120.000 124.000 /// Landau............ 22.000 123.000 26.000 31.000 /// Exponential....... 93.000 198.000 98.000 104.000 /// Binomial(5,0.5)... 30.000 548.000 46.000 65.000 /// Binomial(15,0.5).. 75.000 1615.000 125.000 178.000 /// Poisson(3)........ 96.000 494.000 109.000 125.000 /// Poisson(10)....... 138.000 1236.000 165.000 203.000 /// Poisson(70)....... 818.000 1195.000 835.000 844.000 /// Poisson(100)...... 837.000 1218.000 849.000 864.000 /// GausTF1........... 83.000 180.000 87.000 88.000 /// LandauTF1......... 80.000 180.000 83.000 86.000 /// GausUNURAN........ 40.000 139.000 41.000 44.000 /// PoissonUNURAN(10). 85.000 271.000 92.000 102.000 /// PoissonUNURAN(100) 62.000 256.000 69.000 78.000 /// ~~~ /// /// Note that this tutorial can be executed in interpreted or compiled mode /// /// ~~~{.cpp} /// Root > .x testrandom.C /// Root > .x testrandom.C++ /// ~~~ /// /// \macro_output /// \macro_code /// /// \authors Rene Brun, Lorenzo Moneta #include #include #include #include #include #include #include #include #include void testAll() { int i, N = 2000000; float cpn = 1000000000./N; int N1 = N/10; float cpn1 = cpn*10; // for TRandom1 double x,y; TRandom *rsave = gRandom; TRandom *r0 = new TRandom(); TRandom *r1 = new TRandom1(); TRandom *r2 = new TRandom2(); TRandom *r3 = new TRandom3(); TRandom *r4 = new TRandomMixMax(); TRandom *r5 = new TRandomMixMax17(); TRandom *r6 = new TRandomGen>(); TRandom *r7 = new TRandomMixMax256(); TRandom *r8 = new TRandomGen>(); TRandom *r9 = new TRandomMT64(); TRandom *r10 = new TRandomRanlux48(); TStopwatch sw; printf("Distribution nanoseconds/call\n"); printf(" TRandom TRandom1 TRandom2 TRandom3 MixMax240 MixMax17 Mixmax256_0 MixMax256_2 MixMax256_4 MT_64 Ranlux48\n"); sw.Start(); for (i=0;iRndm(i); } printf("Rndm.............. %8.3f",sw.CpuTime()*cpn); sw.Start(); for (i=0;iRndm(i); } printf(" %8.3f",sw.CpuTime()*cpn1); sw.Start(); for (i=0;iRndm(i); } printf(" %8.3f",sw.CpuTime()*cpn); sw.Start(); for (i=0;iRndm(i); } printf(" %8.3f",sw.CpuTime()*cpn); // new random generators sw.Start(); for (i=0;iRndm(i); } printf(" %8.3f",sw.CpuTime()*cpn); sw.Start(); for (i=0;iRndm(i); } printf(" %8.3f",sw.CpuTime()*cpn); sw.Start(); for (i=0;iRndm(i); } printf(" %8.3f",sw.CpuTime()*cpn); sw.Start(); for (i=0;iRndm(i); } printf(" %8.3f",sw.CpuTime()*cpn); sw.Start(); for (i=0;iRndm(i); } printf(" %8.3f",sw.CpuTime()*cpn); sw.Start(); for (i=0;iRndm(i); } printf(" %8.3f",sw.CpuTime()*cpn); sw.Start(); for (i=0;iRndm(i); } printf(" %8.3f",sw.CpuTime()*cpn1); printf("\n\n"); // RNDMARRAY const int NR = 1000; double rn[NR]; sw.Start(); for (i=0;iRndmArray(NR,rn); } printf("RndmArray......... %8.3f",sw.CpuTime()*cpn); sw.Start(); for (i=0;iRndmArray(NR,rn); } printf(" %8.3f",sw.CpuTime()*cpn1); sw.Start(); for (i=0;iRndmArray(NR,rn); } printf(" %8.3f",sw.CpuTime()*cpn); sw.Start(); for (i=0;iRndmArray(NR,rn); } printf(" %8.3f",sw.CpuTime()*cpn); sw.Start(); for (i=0;iRndmArray(NR,rn); } printf(" %8.3f",sw.CpuTime()*cpn); sw.Start(); for (i=0;iRndmArray(NR,rn); } printf(" %8.3f",sw.CpuTime()*cpn); sw.Start(); for (i=0;iRndmArray(NR,rn); } printf(" %8.3f",sw.CpuTime()*cpn); sw.Start(); for (i=0;iRndmArray(NR,rn); } printf(" %8.3f",sw.CpuTime()*cpn); sw.Start(); for (i=0;iRndmArray(NR,rn); } printf(" %8.3f",sw.CpuTime()*cpn); sw.Start(); for (i=0;iRndmArray(NR,rn); } printf(" %8.3f",sw.CpuTime()*cpn); sw.Start(); for (i=0;iRndmArray(NR,rn); } printf(" %8.3f\n",sw.CpuTime()*cpn1); // Gaus sw.Start(); for (i=0;iGaus(0,1); } printf("Gaus.............. %8.3f",sw.CpuTime()*cpn); sw.Start(); for (i=0;iGaus(0,1); } printf(" %8.3f",sw.CpuTime()*cpn1); sw.Start(); for (i=0;iGaus(0,1); } printf(" %8.3f",sw.CpuTime()*cpn); sw.Start(); for (i=0;iGaus(0,1); } printf(" %8.3f",sw.CpuTime()*cpn); sw.Start(); for (i=0;iGaus(0,1); } printf(" %8.3f",sw.CpuTime()*cpn); sw.Start(); for (i=0;iGaus(0,1); } printf(" %8.3f",sw.CpuTime()*cpn); sw.Start(); for (i=0;iGaus(0,1); } printf(" %8.3f",sw.CpuTime()*cpn); sw.Start(); for (i=0;iGaus(0,1); } printf(" %8.3f",sw.CpuTime()*cpn); sw.Start(); for (i=0;iGaus(0,1); } printf(" %8.3f",sw.CpuTime()*cpn); sw.Start(); for (i=0;iGaus(0,1); } printf(" %8.3f\n",sw.CpuTime()*cpn); // RANNOR sw.Start(); for (i=0;iRannor(x,y); } printf("Rannor............ %8.3f",sw.CpuTime()*cpn); sw.Start(); for (i=0;iRannor(x,y); } printf(" %8.3f",sw.CpuTime()*cpn1); sw.Start(); for (i=0;iRannor(x,y); } printf(" %8.3f",sw.CpuTime()*cpn); sw.Start(); for (i=0;iRannor(x,y); } printf(" %8.3f",sw.CpuTime()*cpn); sw.Start(); for (i=0;iRannor(x,y); } printf(" %8.3f",sw.CpuTime()*cpn); sw.Start(); for (i=0;iRannor(x,y); } printf(" %8.3f",sw.CpuTime()*cpn); sw.Start(); for (i=0;iRannor(x,y); } printf(" %8.3f",sw.CpuTime()*cpn); sw.Start(); for (i=0;iRannor(x,y); } printf(" %8.3f",sw.CpuTime()*cpn); sw.Start(); for (i=0;iRannor(x,y); } printf(" %8.3f",sw.CpuTime()*cpn); sw.Start(); for (i=0;iRannor(x,y); } printf(" %8.3f\n",sw.CpuTime()*cpn); // Landau sw.Start(); for (i=0;iLandau(0,1); } printf("Landau............ %8.3f",sw.CpuTime()*cpn); sw.Start(); for (i=0;iLandau(0,1); } printf(" %8.3f",sw.CpuTime()*cpn1); sw.Start(); for (i=0;iLandau(0,1); } printf(" %8.3f",sw.CpuTime()*cpn); sw.Start(); for (i=0;iLandau(0,1); } printf(" %8.3f\n",sw.CpuTime()*cpn); sw.Start(); for (i=0;iExp(1); } printf("Exponential....... %8.3f",sw.CpuTime()*cpn); sw.Start(); for (i=0;iExp(1); } printf(" %8.3f",sw.CpuTime()*cpn1); sw.Start(); for (i=0;iExp(1); } printf(" %8.3f",sw.CpuTime()*cpn); sw.Start(); for (i=0;iExp(1); } printf(" %8.3f\n",sw.CpuTime()*cpn); sw.Start(); for (i=0;iBinomial(5,0.5); } printf("Binomial(5,0.5)... %8.3f",sw.CpuTime()*cpn); sw.Start(); for (i=0;iBinomial(5,0.5); } printf(" %8.3f",sw.CpuTime()*cpn1); sw.Start(); for (i=0;iBinomial(5,0.5); } printf(" %8.3f",sw.CpuTime()*cpn); sw.Start(); for (i=0;iBinomial(5,0.5); } printf(" %8.3f\n",sw.CpuTime()*cpn); sw.Start(); for (i=0;iBinomial(15,0.5); } printf("Binomial(15,0.5).. %8.3f",sw.CpuTime()*cpn); sw.Start(); for (i=0;iBinomial(15,0.5); } printf(" %8.3f",sw.CpuTime()*cpn1); sw.Start(); for (i=0;iBinomial(15,0.5); } printf(" %8.3f",sw.CpuTime()*cpn); sw.Start(); for (i=0;iBinomial(15,0.5); } printf(" %8.3f\n",sw.CpuTime()*cpn); sw.Start(); for (i=0;iPoisson(3); } printf("Poisson(3)........ %8.3f",sw.CpuTime()*cpn); sw.Start(); for (i=0;iPoisson(3); } printf(" %8.3f",sw.CpuTime()*cpn1); sw.Start(); for (i=0;iPoisson(3); } printf(" %8.3f",sw.CpuTime()*cpn); sw.Start(); for (i=0;iPoisson(3); } printf(" %8.3f\n",sw.CpuTime()*cpn); sw.Start(); for (i=0;iPoisson(10); } printf("Poisson(10)....... %8.3f",sw.CpuTime()*cpn); sw.Start(); for (i=0;iPoisson(10); } printf(" %8.3f",sw.CpuTime()*cpn1); sw.Start(); for (i=0;iPoisson(10); } printf(" %8.3f",sw.CpuTime()*cpn); sw.Start(); for (i=0;iPoisson(10); } printf(" %8.3f\n",sw.CpuTime()*cpn); sw.Start(); for (i=0;iPoisson(70); } printf("Poisson(70)....... %8.3f",sw.CpuTime()*cpn); sw.Start(); for (i=0;iPoisson(70); } printf(" %8.3f",sw.CpuTime()*cpn1); sw.Start(); for (i=0;iPoisson(70); } printf(" %8.3f",sw.CpuTime()*cpn); sw.Start(); for (i=0;iPoisson(70); } printf(" %8.3f\n",sw.CpuTime()*cpn); sw.Start(); for (i=0;iPoisson(100); } printf("Poisson(100)...... %8.3f",sw.CpuTime()*cpn); sw.Start(); for (i=0;iPoisson(100); } printf(" %8.3f",sw.CpuTime()*cpn1); sw.Start(); for (i=0;iPoisson(100); } printf(" %8.3f",sw.CpuTime()*cpn); sw.Start(); for (i=0;iPoisson(100); } printf(" %8.3f\n",sw.CpuTime()*cpn); TF1 *f1 = new TF1("f1","gaus",-4,4); f1->SetParameters(1,0,1); gRandom = r0; sw.Start(); for (i=0;iGetRandom(); } printf("GausTF1........... %8.3f",sw.CpuTime()*cpn); gRandom = r1; sw.Start(); for (i=0;iGetRandom(); } printf(" %8.3f",sw.CpuTime()*cpn); gRandom = r2; sw.Start(); for (i=0;iGetRandom(); } printf(" %8.3f",sw.CpuTime()*cpn); gRandom = r3; sw.Start(); for (i=0;iGetRandom(); } printf(" %8.3f\n",sw.CpuTime()*cpn); TF1 *f2 = new TF1("f2","landau",-5,15); f2->SetParameters(1,0,1); gRandom = r0; sw.Start(); for (i=0;iGetRandom(); } printf("LandauTF1......... %8.3f",sw.CpuTime()*cpn); gRandom = r1; sw.Start(); for (i=0;iGetRandom(); } printf(" %8.3f",sw.CpuTime()*cpn); gRandom = r2; sw.Start(); for (i=0;iGetRandom(); } printf(" %8.3f",sw.CpuTime()*cpn); gRandom = r3; sw.Start(); for (i=0;iGetRandom(); } printf(" %8.3f\n",sw.CpuTime()*cpn); // test using Unuran TUnuran unr0(r0); TUnuran unr1(r1); TUnuran unr2(r2); TUnuran unr3(r3); // continuous distribution (ex. Gaus) TUnuranContDist dist(f1); // use arou method (is probably the fastest) unr0.Init(dist,"arou"); unr1.Init(dist,"arou"); unr2.Init(dist,"arou"); unr3.Init(dist,"arou"); sw.Start(); for (i=0;i 10e-8) { printf("i=%d x=%.8f but should be %.8f\n",i,x,RefValue[i]); rc1 += 1; } } // check whether a state can be saved and restored TFile *file = new TFile("random3.root","RECREATE"); file->SetCompressionLevel(0); r.Write("r"); delete file; file = new TFile("random3.root"); TRandom3 *rs = (TRandom3*) file->Get("r"); for (i=0;i<1000;i++) { if (r.Rndm() - rs->Rndm() != 0) rc2 += 1; } if (rc2 != 0) printf("state restoration failed\n"); return rc1 + rc2; } void testrandom() { testRandom3(); testAll(); }