/************************************************************************* * * $RCSfile: profiler.cxx,v $ * * $Revision: 1.1 $ * * last change: $Author: mh $ $Date: 2002-11-18 15:28:05 $ * * The Contents of this file are made available subject to the terms of * either of the following licenses * * - GNU Lesser General Public License Version 2.1 * - Sun Industry Standards Source License Version 1.1 * * Sun Microsystems Inc., October, 2002 * * GNU Lesser General Public License Version 2.1 * ============================================= * Copyright 2002 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 * * * Sun Industry Standards Source License Version 1.1 * ================================================= * The contents of this file are subject to the Sun Industry Standards * Source License Version 1.1 (the "License"); You may not use this file * except in compliance with the License. You may obtain a copy of the * License at http://www.openoffice.org/license.html. * * Software provided under this License is provided on an "AS IS" basis, * WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING, * WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS, * MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING. * See the License for the specific provisions governing your rights and * obligations concerning the Software. * * The Initial Developer of the Original Code is: Sun Microsystems, Inc. * * Copyright: 2002 by Sun Microsystems, Inc. * * All Rights Reserved. * * Contributor(s): _______________________________________ * * ************************************************************************/ #ifndef _TIME_HXX //autogen #include #endif #ifndef _STRING_HXX //autogen #include #endif #ifndef _SV_SVAPP_HXX //autogen #include #endif #ifndef _INTN_HXX //autogen #include #endif #ifndef _BASIC_TTRESHLP_HXX #include #endif #include "profiler.hxx" TTProfiler::TTProfiler() : pStart( NULL ) , pEnd( NULL ) , bIsProfileIntervalStarted( FALSE ) , bIsProfilingPerCommand( FALSE ) , bIsPartitioning( FALSE ) , bIsAutoProfiling( FALSE ) , pSysDepStatic( NULL ) { InitSysdepProfiler(); pStart = new ProfileSnapshot; pStart->pSysdepProfileSnapshot = NewSysdepSnapshotData(); pEnd = new ProfileSnapshot; pEnd->pSysdepProfileSnapshot = NewSysdepSnapshotData(); StartProfileInterval(); } TTProfiler::~TTProfiler() { if ( IsAutoProfiling() ) StopAutoProfiling(); if ( pStart ) { if ( pStart->pSysdepProfileSnapshot ) DeleteSysdepSnapshotData( pStart->pSysdepProfileSnapshot ); delete pStart; pStart = NULL; } if ( pEnd ) { if ( pEnd->pSysdepProfileSnapshot ) DeleteSysdepSnapshotData( pEnd->pSysdepProfileSnapshot ); delete pEnd; pEnd = 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( pStart ); GetSysdepProfileSnapshot( pStart->pSysdepProfileSnapshot, PROFILE_START ); bIsProfileIntervalStarted = TRUE; } } String TTProfiler::GetProfileLine( ProfileSnapshot *pStart, ProfileSnapshot *pEnd ) { String aProfileString; aProfileString += Pad(GetpApp()->GetAppInternational().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( pStart, pEnd ); aProfileString += GetSysdepProfileLine( pStart->pSysdepProfileSnapshot, pEnd->pSysdepProfileSnapshot ); aProfileString += '\n'; } return aProfileString; } void TTProfiler::EndProfileInterval() { GetProfileSnapshot( pEnd ); GetSysdepProfileSnapshot( pEnd->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( pStart, pEnd, 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 ); }