Hacktoberfest 2026: những issue maintainer đã đánh dấu cho tháng Mười, đang mở và phù hợp người mới. Xem issue Hacktoberfest

`TChain::GetEntries` internal caching ineffective?

Đang mở
#23,738 2 bình luận 0 reaction 1 người được giao Xem trên GitHub

Maintainer thường phản hồi trong vòng 1 ngày

@pcanal đang làm issue này rồi.

Từ ngày 16/10/2026.

Đánh giá

Issue này chưa được đánh giá.

Mô tả

improvement in:TTree
Check duplicate issues.
  • Checked for duplicates
Description

We experienced some longer-than-expected delays when using Podio (internally using a TChain) when switching between the files of a chain. Claude traced this to our, maybe too paranoid, check in the event loop to see if the current entry is in the range of the chain before we access it, e.g. something like:

for (Long64_t i = 0; i < nEntries; ++i)
         if (i < ch.GetEntries())
            ch.GetEntry(i);

which causes us to spend up to 50% of the total runtime in TChain::GetEntries for essentially empty event loops.

Indeed, it looks like the internal caching machinery for fEntries in GetEntries is reset by TChain::LoadTree (called by GetEntry) here:
https://github.com/root-project/root/blob/fbcf83fe9a58e65f36ba55bdc3821a7983f4799a/tree/tree/src/TChain.cxx#L1559

This is causing the event loop to open many more files than expected, which can be seen when running the reproducer below as root -q repro_chain_getentries.C, yielding

Processing repro_chain_getentries.C...
files in chain: 10   files opened in loop: 55
files in chain: 100   files opened in loop: 5050
files in chain: 1000   files opened in loop: 500500

This becomes especially painful when the files are on EOS...

Reproducer
#include <TChain.h>
#include <TFile.h>
#include <TTree.h>
#include <iostream>

void repro_chain_getentries()
{
   {
      TFile file("chain_ge.root", "RECREATE");
      TTree t("t", "t");
      t.Fill();
      t.Write();
   }

   for (int nFiles : {10, 100, 1000}) {
      TChain ch("t");
      for (int f = 0; f < nFiles; ++f)
         ch.Add("chain_ge.root");
      const auto nEntries = ch.GetEntries();

      const auto opensBefore = TFile::GetFileCounter();
      for (Long64_t i = 0; i < nEntries; ++i)
         // Some (paranoid?) bounds check
         if (i < ch.GetEntries())
            ch.GetEntry(i);
      std::cout << "files in chain: " << nFiles
                << "   files opened in loop: " << TFile::GetFileCounter() - opensBefore << '\n';
   }
}
ROOT version
   ------------------------------------------------------------------
  | Welcome to ROOT 6.40.04                        https://root.cern |
  | (c) 1995-2025, The ROOT Team; conception: R. Brun, F. Rademakers |
  | Built for linuxx8664gcc on Oct 07 2026, 01:16:29                 |
  | From tags/6-40-04@6-40-04                                        |
  | With g++ (GCC) 16.1.0 std202302                                  |
  | Try '.help'/'.?', '.demo', '.license', '.credits', '.quit'/'.q'  |
   ------------------------------------------------------------------
Installation method

source /cvmfs/sw-nightlies.hsf.org/key4hep/setup.sh

Operating system

Alma9

Additional context

No response

Ngôn ngữ chính
C++
Star
3.3k
Fork
1.6k
Merge trung bình
2 ngày 17 giờ
Pull request đã merge (30 ngày)
188

Chuẩn bị môi trường

Bắt đầu từ đâu

  1. Đọc hết issue, rồi đọc hướng dẫn đóng góp của dự án.
  2. Bình luận trên issue rằng bạn sẽ nhận — tránh hai người làm cùng một việc.
  3. Fork repository và làm thay đổi trên một nhánh.
  4. Mở pull request có tham chiếu số hiệu của issue.

Issue khác của root-project/root

Tất cả issue của root-project/root

Issue tương tự

Thêm issue về C++

Nhận issue mới trong hộp thư của bạn

Bản tóm tắt ngắn những issue GitHub phù hợp với người mới.