/************************************************************************* * * 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 #endif #ifndef _STRING_HXX //autogen #include #endif #ifndef _UNOTOOLS_LOCALEDATAWRAPPER_HXX #include #endif #ifndef _SV_SVAPP_HXX //autogen #include #endif #ifndef _BASIC_TTRESHLP_HXX #include #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ß 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 ); }