d0ae70008e
2006/09/01 17:16:05 kaib 1.4.16.1: #i68856# Added header markers and pch files
280 lines
7.1 KiB
C++
280 lines
7.1 KiB
C++
/*************************************************************************
|
||
*
|
||
* OpenOffice.org - a multi-platform office productivity suite
|
||
*
|
||
* $RCSfile: profiler.cxx,v $
|
||
*
|
||
* $Revision: 1.5 $
|
||
*
|
||
* last change: $Author: obo $ $Date: 2006-09-17 00:35:47 $
|
||
*
|
||
* The Contents of this file are made available subject to
|
||
* the terms of GNU Lesser General Public License Version 2.1.
|
||
*
|
||
*
|
||
* GNU Lesser General Public License Version 2.1
|
||
* =============================================
|
||
* Copyright 2005 by Sun Microsystems, Inc.
|
||
* 901 San Antonio Road, Palo Alto, CA 94303, USA
|
||
*
|
||
* This library is free software; you can redistribute it and/or
|
||
* modify it under the terms of the GNU Lesser General Public
|
||
* License version 2.1, as published by the Free Software Foundation.
|
||
*
|
||
* This library is distributed in the hope that it will be useful,
|
||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||
* Lesser General Public License for more details.
|
||
*
|
||
* You should have received a copy of the GNU Lesser General Public
|
||
* License along with this library; if not, write to the Free Software
|
||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston,
|
||
* MA 02111-1307 USA
|
||
*
|
||
************************************************************************/
|
||
|
||
// MARKER(update_precomp.py): autogen include statement, do not remove
|
||
#include "precompiled_automation.hxx"
|
||
|
||
|
||
#ifndef _TIME_HXX //autogen
|
||
#include <tools/time.hxx>
|
||
#endif
|
||
#ifndef _STRING_HXX //autogen
|
||
#include <tools/string.hxx>
|
||
#endif
|
||
#ifndef _UNOTOOLS_LOCALEDATAWRAPPER_HXX
|
||
#include <unotools/localedatawrapper.hxx>
|
||
#endif
|
||
#ifndef _SV_SVAPP_HXX //autogen
|
||
#include <vcl/svapp.hxx>
|
||
#endif
|
||
#ifndef _BASIC_TTRESHLP_HXX
|
||
#include <basic/ttstrhlp.hxx>
|
||
#endif
|
||
|
||
|
||
#include "profiler.hxx"
|
||
|
||
|
||
TTProfiler::TTProfiler()
|
||
: mpStart( NULL )
|
||
, mpEnd( NULL )
|
||
, bIsProfileIntervalStarted( FALSE )
|
||
, bIsProfilingPerCommand( FALSE )
|
||
, bIsPartitioning( FALSE )
|
||
, bIsAutoProfiling( FALSE )
|
||
, pSysDepStatic( NULL )
|
||
{
|
||
InitSysdepProfiler();
|
||
mpStart = new ProfileSnapshot;
|
||
mpStart->pSysdepProfileSnapshot = NewSysdepSnapshotData();
|
||
mpEnd = new ProfileSnapshot;
|
||
mpEnd->pSysdepProfileSnapshot = NewSysdepSnapshotData();
|
||
StartProfileInterval();
|
||
}
|
||
|
||
TTProfiler::~TTProfiler()
|
||
{
|
||
if ( IsAutoProfiling() )
|
||
StopAutoProfiling();
|
||
if ( mpStart )
|
||
{
|
||
if ( mpStart->pSysdepProfileSnapshot )
|
||
DeleteSysdepSnapshotData( mpStart->pSysdepProfileSnapshot );
|
||
delete mpStart;
|
||
mpStart = NULL;
|
||
}
|
||
if ( mpEnd )
|
||
{
|
||
if ( mpEnd->pSysdepProfileSnapshot )
|
||
DeleteSysdepSnapshotData( mpEnd->pSysdepProfileSnapshot );
|
||
delete mpEnd;
|
||
mpEnd = NULL;
|
||
}
|
||
DeinitSysdepProfiler();
|
||
}
|
||
|
||
|
||
String TTProfiler::GetProfileHeader()
|
||
{
|
||
UniString aReturn;
|
||
aReturn += '\n';
|
||
if ( !IsAutoProfiling() )
|
||
aReturn.AppendAscii("Befehl").Append(TabString(36));
|
||
|
||
aReturn.AppendAscii(" Zeitdauer");
|
||
aReturn.AppendAscii(" Ticks in %");
|
||
aReturn.Append( GetSysdepProfileHeader() );
|
||
aReturn.AppendAscii("\n");
|
||
return aReturn;
|
||
}
|
||
|
||
|
||
void TTProfiler::StartProfileInterval( BOOL bReadAnyway )
|
||
{
|
||
if ( !bIsProfileIntervalStarted || bReadAnyway )
|
||
{
|
||
GetProfileSnapshot( mpStart );
|
||
GetSysdepProfileSnapshot( mpStart->pSysdepProfileSnapshot, PROFILE_START );
|
||
bIsProfileIntervalStarted = TRUE;
|
||
}
|
||
}
|
||
|
||
String TTProfiler::GetProfileLine( ProfileSnapshot *pStart, ProfileSnapshot *pEnd )
|
||
{
|
||
String aProfileString;
|
||
|
||
aProfileString += Pad(GetpApp()->GetAppLocaleDataWrapper().getDuration( DIFF( pStart, pEnd, aTime) , TRUE, TRUE ), 12);
|
||
|
||
ULONG nProcessTicks = DIFF( pStart, pEnd, nProcessTicks );
|
||
ULONG nSystemTicks = DIFF( pStart, pEnd, nSystemTicks );
|
||
if ( nSystemTicks )
|
||
{
|
||
aProfileString += Pad(UniString::CreateFromInt32( (100 * nProcessTicks) / nSystemTicks ), 11);
|
||
aProfileString += '%';
|
||
}
|
||
else
|
||
aProfileString += Pad(CUniString("?? "), 12);
|
||
|
||
return aProfileString;
|
||
}
|
||
|
||
|
||
String TTProfiler::GetProfileLine( String &aPrefix )
|
||
{
|
||
String aProfileString;
|
||
if ( IsProfilingPerCommand() || IsAutoProfiling() )
|
||
{
|
||
aProfileString = aPrefix;
|
||
aProfileString += TabString(35);
|
||
|
||
|
||
aProfileString += GetProfileLine( mpStart, mpEnd );
|
||
aProfileString += GetSysdepProfileLine( mpStart->pSysdepProfileSnapshot, mpEnd->pSysdepProfileSnapshot );
|
||
aProfileString += '\n';
|
||
}
|
||
|
||
return aProfileString;
|
||
}
|
||
|
||
|
||
void TTProfiler::EndProfileInterval()
|
||
{
|
||
GetProfileSnapshot( mpEnd );
|
||
GetSysdepProfileSnapshot( mpEnd->pSysdepProfileSnapshot, PROFILE_END );
|
||
bIsProfileIntervalStarted = FALSE;
|
||
}
|
||
|
||
|
||
void TTProfiler::GetProfileSnapshot( ProfileSnapshot *pProfileSnapshot )
|
||
{
|
||
pProfileSnapshot->aTime = Time();
|
||
pProfileSnapshot->nProcessTicks = Time::GetProcessTicks();
|
||
pProfileSnapshot->nSystemTicks = Time::GetSystemTicks();
|
||
}
|
||
|
||
|
||
void TTProfiler::StartProfilingPerCommand() // Jeden Befehl mitschneiden
|
||
{
|
||
bIsProfilingPerCommand = TRUE;
|
||
}
|
||
|
||
void TTProfiler::StopProfilingPerCommand()
|
||
{
|
||
bIsProfilingPerCommand = FALSE;
|
||
}
|
||
|
||
void TTProfiler::StartPartitioning()
|
||
{
|
||
bIsPartitioning = TRUE;
|
||
}
|
||
|
||
void TTProfiler::StopPartitioning()
|
||
{
|
||
bIsPartitioning = TRUE;
|
||
}
|
||
|
||
ULONG TTProfiler::GetPartitioningTime()
|
||
{
|
||
return DIFF( mpStart, mpEnd, nSystemTicks );
|
||
}
|
||
|
||
|
||
|
||
void TTProfiler::StartAutoProfiling( ULONG nMSec )
|
||
{
|
||
if ( !bIsAutoProfiling )
|
||
{
|
||
pAutoStart = new ProfileSnapshot;
|
||
pAutoStart->pSysdepProfileSnapshot = NewSysdepSnapshotData();
|
||
pAutoEnd = new ProfileSnapshot;
|
||
pAutoEnd->pSysdepProfileSnapshot = NewSysdepSnapshotData();
|
||
GetProfileSnapshot( pAutoStart );
|
||
GetSysdepProfileSnapshot( pAutoStart->pSysdepProfileSnapshot, PROFILE_START );
|
||
SetTimeout( nMSec );
|
||
bIsAutoProfiling = TRUE;
|
||
Start();
|
||
}
|
||
|
||
}
|
||
|
||
void TTProfiler::Timeout()
|
||
{
|
||
GetProfileSnapshot( pAutoEnd );
|
||
GetSysdepProfileSnapshot( pAutoEnd->pSysdepProfileSnapshot, PROFILE_END );
|
||
String aLine;
|
||
|
||
aLine += GetProfileLine( pAutoStart, pAutoEnd );
|
||
aLine += GetSysdepProfileLine( pAutoStart->pSysdepProfileSnapshot, pAutoEnd->pSysdepProfileSnapshot );
|
||
aLine += '\n';
|
||
|
||
aAutoProfileBuffer += aLine;
|
||
|
||
ProfileSnapshot *pTemp = pAutoStart; // Tauschen, so da<64> jetziges Ende n<>chsten Start wird
|
||
pAutoStart = pAutoEnd;
|
||
pAutoEnd = pTemp;
|
||
|
||
Start(); // Timer neu starten
|
||
}
|
||
|
||
String TTProfiler::GetAutoProfiling()
|
||
{
|
||
String aTemp(aAutoProfileBuffer);
|
||
aAutoProfileBuffer.Erase();
|
||
return aTemp;
|
||
}
|
||
|
||
void TTProfiler::StopAutoProfiling()
|
||
{
|
||
if ( bIsAutoProfiling )
|
||
{
|
||
Stop();
|
||
bIsAutoProfiling = FALSE;
|
||
}
|
||
}
|
||
|
||
|
||
|
||
//String TTProfiler::Hex( ULONG nNr )
|
||
String TTProfiler::Dec( ULONG nNr )
|
||
{
|
||
String aRet(UniString::CreateFromInt32(nNr));
|
||
if ( nNr < 100 )
|
||
{
|
||
aRet = Pad( aRet, 3);
|
||
aRet.SearchAndReplaceAll(' ','0');
|
||
}
|
||
aRet.Insert( ',', aRet.Len() - 2 );
|
||
return aRet;
|
||
}
|
||
|
||
String TTProfiler::Pad( const String aS, xub_StrLen nLen )
|
||
{
|
||
if ( nLen > aS.Len() )
|
||
return UniString().Fill( nLen - aS.Len() ).Append( aS );
|
||
else
|
||
return CUniString(" ").Append( aS );
|
||
}
|
||
|
||
|