Hello,
The change of std::map to TMap in our code has
caused a perfomance penalty by factor 4 for our test.
That's why I'd like to understand if
TMap was used in an optimal way.
The description what has been done is below,
the full class is in the attachement.
(It would take more time to extract the problem into
a simpler example and to reproduce the problem in it.)
Thank you.
Versions: Root 3.05.07, gcc 3.1
Ivana Hrivnacova
-----
The map is defined as:
STL:
typedef map<AliMpIntPair, AliMpConnection*> ConnectionMap_t;
typedef ConnectionMap_t::const_iterator ConnectionMapCIterator;
ConnectionMap_t fConnections; //! Map (ix,iy) of connections
Root:
typedef TMap ConnectionMap_t;
typedef TMapIter ConnectionMapCIterator;
ConnectionMap_t fConnections; //! Map (ix,iy) of connections
The map is filled by
(it is filled only once in the program):
const AliMpIntPair& localIndices;
AliMpConnection* connection;
fConnections[localIndices]=connection; // STL
fConnections.Add(new AliMpIntPair(localIndices), connection); //Root
The search by a key is performed as:
#ifdef WITH_STL
ConnectionMapCIterator i = fConnections.find(localIndices);
if (i != fConnections.end())
return i->second;
else
return 0;
#endif
#ifdef WITH_ROOT
AliMpIntPair* key;
ConnectionMapCIterator i(&fConnections);
while ((key = (AliMpIntPair*)i.Next())) {
if (*key == localIndices)
return (AliMpConnection*)fConnections.GetValue(key);
}
return 0;
#endif
The search by various characteristics of AliMpConnection
is performed as:
#ifdef WITH_STL
for (ConnectionMapCIterator i = fConnections.begin(); i!=fConnections.end();++i)
if (i->second->GetGassiNum()==gassiNum) return i->second;
#endif
#ifdef WITH_ROOT
TObject* key;
AliMpConnection* connection;
ConnectionMapCIterator i(&fConnections);
while ((key = i.Next())) {
connection = (AliMpConnection*)fConnections.GetValue(key);
if (connection->GetGassiNum()==gassiNum) return connection;
}
#endif
--
==============================================================
e-mail: Ivana.Hrivnacova@cern.ch
address: Institut Physique Nucleaire, 91406 Orsay, France
phone: (33) 01 69 15 65 94
==============================================================
This archive was generated by hypermail 2b29 : Thu Jan 01 2004 - 17:50:16 MET