Main Page | Namespace List | Class Hierarchy | Alphabetical List | Class List | File List | Namespace Members | Class Members | File Members | Related Pages

memory-measurement.cpp

Go to the documentation of this file.
00001 
00002 /***************************************************************************
00003  *                                                                         *
00004  *   This program is free software; you can redistribute it and/or modify  *
00005  *   it under the terms of the GNU General Public License as published by  *
00006  *   the Free Software Foundation; either version 2 of the License, or     *
00007  *   (at your option) any later version.                                   *
00008  *                                                                         *
00009  ***************************************************************************/
00010 
00011 #include <sstream>
00012 
00013 #include "memory-measurement.h"
00014 #include "memsize_interface.h"
00015 #include "iconrepository.h"
00016 
00017 #include "gamemap.h"
00018 
00019 
00020 
00021 void MemoryMeasurement::measureTypes()
00022 {
00023       
00024    Node* node = new Node( "Type Repositories" );
00025    root.add( node );
00026    
00027    node->add( measure( vehicleTypeRepository ));
00028    node->add( measure( terrainTypeRepository ));
00029    node->add( measure( objectTypeRepository ));
00030    node->add( measure( buildingTypeRepository )); 
00031    // node->add( measure( technologyRepository ));
00032 
00033 }
00034  
00035  
00036 void MemoryMeasurement::measure( GameMap* gamemap )
00037 {
00038    Node* node = new Node( "Current Map" );
00039    root.add( node );
00040    node->usage = gamemap->getMemoryFootprint();
00041 
00042    Node* buildings = new Node("Buildings");
00043    node->add( buildings );
00044    Node* units = new Node("Units");
00045    node->add( units );
00046 
00047    for ( int i = 0; i < gamemap->getPlayerCount(); ++i ) {
00048       Player& p = gamemap->getPlayer(i);
00049       for ( Player::VehicleList::iterator i = p.vehicleList.begin(); i != p.vehicleList.end(); ++i )
00050          units->usage += (*i)->getMemoryFootprint();
00051 
00052       for ( Player::BuildingList::iterator i = p.buildingList.begin(); i != p.buildingList.end(); ++i )
00053          buildings->usage += (*i)->getMemoryFootprint();
00054    }
00055 
00056    Node* fields = new Node("Fields");
00057    node->add( fields);
00058 
00059 
00060    Node* objects = new Node("Objects");
00061    fields->add(objects);
00062 
00063    for ( int y = 0; y < gamemap->ysize; ++y )
00064       for ( int x = 0; x < gamemap->xsize; ++x ) {
00065          tfield* fld = gamemap->getField(x,y);
00066          fields->usage += fld->getMemoryFootprint();
00067          objects->usage += sizeof( Object ) * fld->objects.size();
00068       }
00069   
00070    
00071 }
00072       
00073 void MemoryMeasurement::measureIcons()
00074 {
00075    Node* node = new Node( "Global Images" );
00076    root.add( node );
00077    node->usage = IconRepository::getMemoryFootprint();
00078 }
00079 
00080  
00081  
00082 int MemoryMeasurement::Node::sum()
00083 {
00084    int sum = usage;
00085    for ( deallocating_vector<Node*>::iterator i = childs.begin(); i != childs.end(); ++i )
00086       sum += (*i)->sum();
00087    return sum;
00088 }
00089 
00090 
00091 ASCString MemoryMeasurement::Node::prettyPrint( int indent )
00092 {
00093    ASCString result; // ( 2 * indent, ' ' );
00094    result += "#indent=" + ASCString::toString(indent*20) + "," + ASCString::toString(indent*20) + "#";
00095    result += name + ": " + ASCString::toString(usage/1024) + " / " + ASCString::toString( sum()/1024) + "\n";
00096    for ( deallocating_vector<Node*>::iterator i = childs.begin(); i != childs.end(); ++i )
00097       result += (*i)->prettyPrint( indent + 1);
00098    return result;
00099 }
00100 
00101 
00102  
00103 template<class T>
00104 MemoryMeasurement::Node* MemoryMeasurement::measure( ItemRepository<T>& repository )
00105 {
00106    
00107    Node* node = new Node( repository.getTypeName() );
00108    
00109    node->usage += for_each ( repository.getVector().begin(), repository.getVector().end(), MemorySum<T>() ).size;
00110    
00111    return node;
00112 }
00113  
00114 
00115  
00116  template<class T> 
00117  struct ObjectStorage : public unary_function<T, void>
00118  {
00119     static bool compare( const pair<int,int>& a1, const pair<int,int>& a2 )
00120     {
00121        return a1.second > a2.second;
00122     }
00123        
00124     typedef vector< pair<int,int> > Storage;
00125     Storage storage;
00126     void operator() (const T& x) { storage.push_back( make_pair(x->id, getMemoryFootprint(*x))); };
00127     ASCString print()
00128     {
00129        sort( storage.begin(), storage.end(), &compare );
00130 
00131        ASCString s;
00132        for ( Storage::iterator i = storage.begin(); i != storage.end(); ++i ) {
00133           ObjectType* o = objectTypeRepository.getObject_byID(i->first);
00134           s += ASCString::toString(i->second/1024) + " " + o->name  + "(ID: " + ASCString::toString(i->first) + "; " + o->filename + ")\n";
00135        }
00136           
00137        return s;
00138     }
00139  };
00140 
00141 
00142 
00143 ASCString MemoryMeasurement::getResult()
00144 {
00145    ASCString result = "#fontsize=16#Memory Footprint\n#fontsize=12#all sizes in kB\n\n";
00146    result += root.prettyPrint(0);
00147 
00148    result += "#indent=0,0#";
00149 
00150    result += "\n\n#fontsize=16#Objects#fontsize=12#\n\n";
00151 
00152    // for_each ( objectTypeRepository.getVector().begin(), objectTypeRepository.getVector().end(), ObjectStorage<ObjectType*>() );
00153    result += for_each ( objectTypeRepository.getVector().begin(), objectTypeRepository.getVector().end(), ObjectStorage<ObjectType*>() ).print();
00154    return result;
00155 }
00156 
00157 
00158 
00159 
00160  

Generated on Tue Jun 24 01:27:45 2008 for Advanced Strategic Command by  doxygen 1.4.2