2079 {
2080 using namespace asg::msgUserCode;
2082
2083
2084 for (const auto& td : testDefinitions)
2085 {
2086 if (!td.sysName.empty())
2087 {
2088 auto *sysTool = dynamic_cast<CP::ISystematicsTool*>(td.tool);
2089 if (!sysTool)
2090 throw std::runtime_error ("tool does not support systematics");
2091 std::cout << "applying systematic variation: " << td.sysName << std::endl;
2092 if (sysTool->applySystematicVariation (CP::SystematicSet (td.sysName)).isFailure())
2093 throw std::runtime_error ("failed to apply systematic variation: " + td.sysName);
2094 }
2095 }
2096
2098 {
2099
2100 ColumnVectorHeader columnHeader;
2101
2102
2103 std::vector<TestUtils::ToolData> toolDataVec;
2104 for (const auto& td : testDefinitions)
2105 toolDataVec.emplace_back (userConfiguration, td, columnHeader);
2106
2108
2109
2111
2112
2114 column->connectColumnIndices (columnHeader);
2115
2116 Benchmark benchmarkEmpty ("empty");
2117 Benchmark benchmarkCheck ("", userConfiguration.batchSize);
2118
2121 const auto startTime = std::chrono::high_resolution_clock::now();
2122 bool endLoop = false;
2123 for (; !endLoop; ++
entry)
2124 {
2125
2126
2127 benchmarkEmpty.startTimer ();
2128 benchmarkEmpty.stopTimer ();
2129
2130 ColumnVectorData columnData (&columnHeader);
2133 if ((entry + 1) % userConfiguration.batchSize == 0)
2134 {
2136 {
2138 column->collectColumnData ();
2139 }
2141 column->setData (columnData);
2142
2143 benchmarkCheck.startTimer ();
2144 columnData.checkData ();
2145 benchmarkCheck.stopTimer ();
2146
2147 for (auto& toolData : toolDataVec)
2148 toolData.call (columnData);
2151 if ((std::chrono::high_resolution_clock::now() - startTime) > userConfiguration.targetTime)
2152 endLoop = true;
2154 {
2156 column->collectColumnData ();
2157 }
2158 }
2160 std::cout <<
"Total entries read: " <<
entry << std::endl;
2161 const float emptyTime = benchmarkEmpty.getEntryTime(0).value();
2163 benchmarkEmpty.setSilence();
2164 const auto checkTime = benchmarkCheck.getEntryTime(emptyTime);
2166 std::cout <<
"Check data time: " <<
checkTime.value() <<
"ns" << std::endl;
2167 benchmarkCheck.setSilence();
2168 {
2169 std::vector<TestUtils::BranchPerfData> branchPerfData;
2170 TestUtils::BranchPerfData
summary;
2175 summary.entries = std::nullopt;
2176 summary.nullEntries = std::nullopt;
2178 {
2179 branchPerfData.push_back (
column->getPerfData (emptyTime));
2180 summary.timeRead.value() += branchPerfData.back().timeRead.value_or(0);
2181 summary.timeUnpack.value() += branchPerfData.back().timeUnpack.value_or(0);
2182 summary.timeShallowCopy.value() += branchPerfData.back().timeShallowCopy.value_or(0);
2183 }
2184 std::sort (branchPerfData.begin(), branchPerfData.end(), [] (
const auto&
a,
const auto& b) {return a.name < b.name;});
2185 branchPerfData.insert (branchPerfData.end(), summary);
2186 const std::size_t nameWidth = std::max_element (branchPerfData.begin(), branchPerfData.end(), [] (
const auto&
a,
const auto& b) {return a.name.size() < b.name.size();})->name.size();
2187 std::string
header = std::format (
"{:{}} | read(ns) | unpack(ns) | size(B) | rate(MB/s) | compression | baskets | entries | null",
"branch name", nameWidth);
2188 std::cout <<
"\n" <<
header << std::endl;
2189 std::cout << std::string (
header.size(),
'-') << std::endl;
2190 for (
auto&
data : branchPerfData)
2191 {
2192 if (
data.name ==
"total")
2193 std::cout << std::string (
header.size(),
'-') << std::endl;
2194 std::cout << std::format (
"{:{}} |",
data.name, nameWidth);
2196 std::cout << std::format (
"{:>9.0f} |",
data.timeRead.value());
2197 else
2198 std::cout << " |";
2199 if (
data.timeUnpack)
2200 std::cout << std::format (
"{:>11.1f} |",
data.timeUnpack.value());
2201 else
2202 std::cout << " |";
2204 std::cout << std::format (
"{:>8.1f} |",
data.entrySize.value());
2205 else
2206 std::cout << " |";
2207 if (
data.timeRead &&
data.entrySize)
2208 std::cout << std::format (
"{:>11.1f} |", (
data.entrySize.value() / (
data.timeRead.value() * 1e-3 * 1.024 * 1.024)));
2209 else
2210 std::cout << " |";
2211 if (
data.entrySize &&
data.uncompressedSize)
2212 std::cout << std::format (
"{:>12.2f} |",
float (
data.uncompressedSize.value()) /
data.entrySize.value());
2213 else
2214 std::cout << " |";
2215 if (
data.numBaskets)
2216 std::cout << std::format (
"{:>8} |",
data.numBaskets.value());
2217 else
2218 std::cout << " |";
2220 std::cout << std::format (
"{:>8.2f} |",
static_cast<float>(
data.entries.value())/
numberOfEvents);
2221 else
2222 std::cout << " |";
2223 if (
data.nullEntries &&
data.entries)
2224 std::cout << std::format (
"{:>4.0f}%",
static_cast<float>(
data.nullEntries.value()) /
data.entries.value() * 100.0f);
2225 std::cout << std::endl;
2226 }
2227 }
2228 {
2229 std::vector<TestUtils::ToolPerfData> toolPerfData;
2230 for (auto& toolData : toolDataVec)
2231 {
2232 toolPerfData.emplace_back ();
2233 toolPerfData.back().name = toolData.name;
2234 toolPerfData.back().timeCall = toolData.benchmarkCall.getEntryTime (emptyTime);
2235 if (userConfiguration.runToolTwice)
2236 toolPerfData.back().timeCall2 = toolData.benchmarkCall2.getEntryTime (emptyTime);
2237 }
2238 const std::size_t nameWidth = std::max_element (toolPerfData.begin(), toolPerfData.end(), [] (
const auto&
a,
const auto& b) {return a.name.size() < b.name.size();})->name.size();
2239 std::string
header = std::format (
"{:{}} | call(ns) | call2(ns)",
"tool name", nameWidth);
2240 std::cout <<
"\n" <<
header << std::endl;
2241 std::cout << std::string (
header.size(),
'-') << std::endl;
2242 for (
auto&
data : toolPerfData)
2243 {
2244 std::cout << std::format (
"{:{}} |",
data.name, nameWidth);
2246 std::cout << std::format (
"{:>9.0f} |",
data.timeCall.value());
2247 else
2248 std::cout << " |";
2250 std::cout << std::format (
"{:>10.0f}",
data.timeCall2.value());
2251 else
2252 std::cout << " ";
2253 std::cout << std::endl;
2254 }
2255
2256 if (toolPerfData.size() > 1)
2257 {
2258 std::optional<float> totalCall, totalCall2;
2259 for (
const auto&
data : toolPerfData)
2260 {
2262 totalCall = totalCall.value_or (0) +
data.timeCall.value();
2264 totalCall2 = totalCall2.value_or (0) +
data.timeCall2.value();
2265 }
2266 std::cout << std::string (
header.size(),
'-') << std::endl;
2267 std::cout << std::format ("{:{}} |", "total", nameWidth);
2268 if (totalCall)
2269 std::cout << std::format ("{:>9.0f} |", totalCall.value());
2270 else
2271 std::cout << " |";
2272 if (totalCall2)
2273 std::cout << std::format ("{:>10.0f}", totalCall2.value());
2274 else
2275 std::cout << " ";
2276 std::cout << std::endl;
2277 }
2278 }
2280 {
2283 {
2284 const auto& testDefinition = testDefinitions[0];
2286 }
2287 }
char data[hepevt_bytes_allocation_ATLAS]
static float getTickDuration()
void runXaodArrayTest(const UserConfiguration &userConfiguration, const TestDefinition &testDefinition, TFile *file)
void runXaodTest(const UserConfiguration &userConfiguration, std::span< const TestDefinition > testDefinitions, TFile *file)
constexpr unsigned columnarAccessMode
void sort(typename DataModel_detail::iterator< DVL > beg, typename DataModel_detail::iterator< DVL > end)
Specialization of sort for DataVector/List.
std::vector< std::shared_ptr< TestUtils::IColumnData > > usedColumns
void setupKnownColumns(std::span< const TestUtils::TestDefinition > testDefinitions)
void setupColumns(const ColumnVectorHeader &columnHeader)
static UserConfiguration fromEnvironment()
create a UserConfiguration, loading from the file pointed to by the COLUMNAR_TEST_CONFIG environment ...