diff --git a/reco/eventbuilder/digis/CbmTaskBuildRawEvents.cxx b/reco/eventbuilder/digis/CbmTaskBuildRawEvents.cxx
index 2bd074b70ad40a9fdcd7d2e72119c664e3a2e2b9..3cb8a028231972e52340a723713a31c31a7f2d29 100644
--- a/reco/eventbuilder/digis/CbmTaskBuildRawEvents.cxx
+++ b/reco/eventbuilder/digis/CbmTaskBuildRawEvents.cxx
@@ -20,6 +20,7 @@
 #include <TH1.h>
 #include <TH2.h>
 #include <THttpServer.h>
+#include <TStopwatch.h>
 
 #include <iomanip>
 
@@ -64,6 +65,11 @@ void CbmTaskBuildRawEvents::AddSeedTimeFillerToList(RawEventBuilderDetector seed
 
 InitStatus CbmTaskBuildRawEvents::Init()
 {
+  if (fbGetTimings) {
+    fTimer = new TStopwatch;
+    fTimer->Start();
+  }
+
   /// Get a handle from the IO manager
   FairRootManager* ioman = FairRootManager::Instance();
 
@@ -146,6 +152,8 @@ InitStatus CbmTaskBuildRawEvents::Init()
   if (kTRUE == fpAlgo->InitAlgo()) return kSUCCESS;
   else
     return kFATAL;
+
+  if (fTimer != nullptr) { fTimer->Stop(); }
 }
 
 
@@ -153,6 +161,7 @@ InitStatus CbmTaskBuildRawEvents::ReInit() { return kSUCCESS; }
 
 void CbmTaskBuildRawEvents::Exec(Option_t* /*option*/)
 {
+  if (fTimer != nullptr) { fTimer->Start(kFALSE); }
   LOG(debug2) << "CbmTaskBuildRawEvents::Exec => Starting sequence";
   //Warning: Int_t must be used for the loop counters instead of UInt_t,
   //as the digi manager can return -1, which would be casted to +1
@@ -258,6 +267,8 @@ void CbmTaskBuildRawEvents::Exec(Option_t* /*option*/)
   /// Save the resulting vector of events in TClonesArray
   FillOutput();
   LOG(debug2) << "CbmTaskBuildRawEvents::Exec => Done";
+
+  if (fTimer != nullptr) { fTimer->Stop(); }
 }
 
 void CbmTaskBuildRawEvents::FillSeedTimesFromDetList()
@@ -356,11 +367,22 @@ UInt_t CbmTaskBuildRawEvents::GetNofDigis(ECbmModuleId _system)
   return 0;
 }
 
+void CbmTaskBuildRawEvents::PrintTimings()
+{
+  if (fTimer == nullptr) { LOG(fatal) << "Trying to print timings but timer not set"; }
+  else {
+    Double_t rtime = fTimer->RealTime();
+    Double_t ctime = fTimer->CpuTime();
+    LOG(info) << "CbmTaskBuildRawEvents: Real time " << rtime << " s, CPU time " << ctime << " s";
+  }
+}
+
 void CbmTaskBuildRawEvents::Finish()
 {
   /// Call Algo finish method
   fpAlgo->Finish();
   if (fbFillHistos) { SaveHistos(); }
+  if (fbGetTimings) { PrintTimings(); }
 }
 
 void CbmTaskBuildRawEvents::FillOutput()
diff --git a/reco/eventbuilder/digis/CbmTaskBuildRawEvents.h b/reco/eventbuilder/digis/CbmTaskBuildRawEvents.h
index deaf093bf6e8df7b23ec167dfb823d58e6dc7c53..7ec4cc99a74e735b3e080407c735db38d48f482b 100644
--- a/reco/eventbuilder/digis/CbmTaskBuildRawEvents.h
+++ b/reco/eventbuilder/digis/CbmTaskBuildRawEvents.h
@@ -33,6 +33,7 @@
 class CbmDigiManager;
 class RawEventBuilderDetector;
 class TClonesArray;
+class TStopwatch;
 
 enum class EOverlapModeRaw;
 
@@ -118,8 +119,10 @@ public:
   void SetTimings(Bool_t bFlagIn = kTRUE)
   {
     if (nullptr != fpAlgo) fpAlgo->SetTimings(bFlagIn);
+    fbGetTimings = bFlagIn;
   }
 
+  void PrintTimings();
   void SetSeedTimeFiller(RawEventBuilderDetector seedDet);
   void AddSeedTimeFillerToList(RawEventBuilderDetector seedDet);
   void DumpSeedTimesFromDetList();
@@ -150,12 +153,15 @@ private:
 
   void FillSeedTimesFromDetList();
 
+  TStopwatch* fTimer = nullptr;  //! is create when fbGetTimings is set before init
+
   CbmAlgoBuildRawEvents* fpAlgo = nullptr;
 
   TClonesArray* fEvents = nullptr;  //! output container of CbmEvents
 
   Bool_t fbFillHistos {kTRUE};             //! Switch ON/OFF filling of histograms
   Bool_t fbWriteHistosToFairSink {kTRUE};  //! Write histos to FairRootManager instead of separate file
+  Bool_t fbGetTimings = kFALSE;            //! Measure CPU time using stopwatch
 
   /** Name of the histogram output file **/
   TString fsOutFileName {"data/HistosEvtWin.root"};