tdf#100442 use unordered_set for GraphicManager's maObjList
Speeds up ImplCheckSizeOfSwappedInGraphics. maObjList didn't seem to depend on it being a vector. Change-Id: I0028186b5c4f53ae198b9b33a31c51f0b2e5eb45 Reviewed-on: https://gerrit.libreoffice.org/28439 Tested-by: Jenkins <ci@libreoffice.org> Reviewed-by: Michael Meeks <michael.meeks@collabora.com> Tested-by: Michael Meeks <michael.meeks@collabora.com>
This commit is contained in:
committed by
Michael Meeks
parent
67ef208b2b
commit
fdc867a4bc
@@ -24,6 +24,8 @@
|
|||||||
#include <svtools/svtdllapi.h>
|
#include <svtools/svtdllapi.h>
|
||||||
#include <o3tl/typed_flags_set.hxx>
|
#include <o3tl/typed_flags_set.hxx>
|
||||||
|
|
||||||
|
#include <unordered_set>
|
||||||
|
|
||||||
enum class GraphicManagerDrawFlags
|
enum class GraphicManagerDrawFlags
|
||||||
{
|
{
|
||||||
CACHED = 0x01,
|
CACHED = 0x01,
|
||||||
@@ -504,8 +506,6 @@ public:
|
|||||||
sal_uLong GetDataChangeTimeStamp() const { return mnDataChangeTimeStamp; }
|
sal_uLong GetDataChangeTimeStamp() const { return mnDataChangeTimeStamp; }
|
||||||
};
|
};
|
||||||
|
|
||||||
typedef ::std::vector< GraphicObject* > GraphicObjectList_impl;
|
|
||||||
|
|
||||||
class SVT_DLLPUBLIC GraphicManager
|
class SVT_DLLPUBLIC GraphicManager
|
||||||
{
|
{
|
||||||
friend class GraphicObject;
|
friend class GraphicObject;
|
||||||
@@ -513,7 +513,7 @@ class SVT_DLLPUBLIC GraphicManager
|
|||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
||||||
GraphicObjectList_impl maObjList;
|
std::unordered_set< GraphicObject* > maObjList;
|
||||||
sal_uLong mnUsedSize; // currently used memory footprint of all swapped in graphics
|
sal_uLong mnUsedSize; // currently used memory footprint of all swapped in graphics
|
||||||
GraphicCache* mpCache;
|
GraphicCache* mpCache;
|
||||||
|
|
||||||
|
@@ -146,7 +146,7 @@ class GraphicCacheEntry
|
|||||||
{
|
{
|
||||||
private:
|
private:
|
||||||
|
|
||||||
GraphicObjectList_impl maGraphicObjectList;
|
std::vector< GraphicObject* > maGraphicObjectList;
|
||||||
|
|
||||||
GraphicID maID;
|
GraphicID maID;
|
||||||
GfxLink maGfxLink;
|
GfxLink maGfxLink;
|
||||||
@@ -336,7 +336,7 @@ void GraphicCacheEntry::AddGraphicObjectReference( const GraphicObject& rObj, Gr
|
|||||||
bool GraphicCacheEntry::ReleaseGraphicObjectReference( const GraphicObject& rObj )
|
bool GraphicCacheEntry::ReleaseGraphicObjectReference( const GraphicObject& rObj )
|
||||||
{
|
{
|
||||||
for(
|
for(
|
||||||
GraphicObjectList_impl::iterator it = maGraphicObjectList.begin();
|
auto it = maGraphicObjectList.begin();
|
||||||
it != maGraphicObjectList.end();
|
it != maGraphicObjectList.end();
|
||||||
++it
|
++it
|
||||||
) {
|
) {
|
||||||
|
@@ -141,10 +141,10 @@ bool GraphicManager::DrawObj( OutputDevice* pOut, const Point& rPt, const Size&
|
|||||||
void GraphicManager::ImplRegisterObj( const GraphicObject& rObj, Graphic& rSubstitute,
|
void GraphicManager::ImplRegisterObj( const GraphicObject& rObj, Graphic& rSubstitute,
|
||||||
const OString* pID, const GraphicObject* pCopyObj )
|
const OString* pID, const GraphicObject* pCopyObj )
|
||||||
{
|
{
|
||||||
assert(std::find(maObjList.begin(), maObjList.end(),
|
assert(maObjList.find(const_cast<GraphicObject*>(&rObj)) == maObjList.end());
|
||||||
const_cast<GraphicObject*>(&rObj)) == maObjList.end());
|
|
||||||
|
maObjList.emplace( const_cast<GraphicObject*>(&rObj) );
|
||||||
|
|
||||||
maObjList.push_back( const_cast<GraphicObject*>(&rObj) );
|
|
||||||
mpCache->AddGraphicObject( rObj, rSubstitute, pID, pCopyObj );
|
mpCache->AddGraphicObject( rObj, rSubstitute, pID, pCopyObj );
|
||||||
if( !rObj.IsSwappedOut() )
|
if( !rObj.IsSwappedOut() )
|
||||||
mnUsedSize += rObj.maGraphic.GetSizeBytes();
|
mnUsedSize += rObj.maGraphic.GetSizeBytes();
|
||||||
@@ -158,13 +158,9 @@ void GraphicManager::ImplUnregisterObj( const GraphicObject& rObj )
|
|||||||
assert(mnUsedSize >= rObj.maGraphic.GetSizeBytes());
|
assert(mnUsedSize >= rObj.maGraphic.GetSizeBytes());
|
||||||
mnUsedSize -= rObj.maGraphic.GetSizeBytes();
|
mnUsedSize -= rObj.maGraphic.GetSizeBytes();
|
||||||
}
|
}
|
||||||
for( GraphicObjectList_impl::iterator it = maObjList.begin(); it != maObjList.end(); ++it )
|
if ( 0 < maObjList.erase( const_cast<GraphicObject*>(&rObj) ) )
|
||||||
{
|
return;
|
||||||
if ( *it == &rObj ) {
|
|
||||||
maObjList.erase( it );
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
assert(false); // surely it should have been registered?
|
assert(false); // surely it should have been registered?
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -203,7 +199,7 @@ void GraphicManager::ImplCheckSizeOfSwappedInGraphics(const GraphicObject* pGrap
|
|||||||
std::vector< GraphicObject* > aCandidates(maObjList.begin(), maObjList.end());
|
std::vector< GraphicObject* > aCandidates(maObjList.begin(), maObjList.end());
|
||||||
// if we use more currently, sort by last DataChangeTimeStamp
|
// if we use more currently, sort by last DataChangeTimeStamp
|
||||||
// sort by DataChangeTimeStamp so that the oldest get removed first
|
// sort by DataChangeTimeStamp so that the oldest get removed first
|
||||||
::std::sort(aCandidates.begin(), aCandidates.end(), simpleSortByDataChangeTimeStamp());
|
std::sort(aCandidates.begin(), aCandidates.end(), simpleSortByDataChangeTimeStamp());
|
||||||
|
|
||||||
for(sal_uInt32 a(0); mnUsedSize >= nMaxCacheSize && a < aCandidates.size(); a++)
|
for(sal_uInt32 a(0); mnUsedSize >= nMaxCacheSize && a < aCandidates.size(); a++)
|
||||||
{
|
{
|
||||||
@@ -214,7 +210,7 @@ void GraphicManager::ImplCheckSizeOfSwappedInGraphics(const GraphicObject* pGrap
|
|||||||
{
|
{
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
if (std::find(maObjList.begin(), maObjList.end(), pObj) == maObjList.end())
|
if (maObjList.find(pObj) == maObjList.end())
|
||||||
{
|
{
|
||||||
// object has been deleted when swapping out another one
|
// object has been deleted when swapping out another one
|
||||||
continue;
|
continue;
|
||||||
|
Reference in New Issue
Block a user