Anders Lund wrote:
> Jeg sidder og er ved at lave en kode der kan teste min webserver. Der er
> bare et par hurtige spørsmål jeg gerne vil have svar på.
>
> 1)
> Hvordan laver man en timer. Jeg ville gerne kunne måle hvorlang tid (i ms)
> det tager at afvikle en stump kode.
long start = System.currentTimeMillis();
// her smides kode som der tages tid på
System.out.println("Det tog " + (System.currentTimeMillis()-start) + " ms.");
Jeg fandt også lige en gammel klasse frem som understøtter indlejerede
tidstagninger og pauser - fx.:
int outerTimerID = Timer.start();
while( ... )
{
int innerTimerID = Timer.start();
// her smides noget kode
Timer.pause( innerTimerID );
// kode i dette område gider vi ikke medtage i tidstagningen for
// den indre blok - kun for den ydre
Timer.resume( innerTimerID );
Timer.end( innerTimerID, "beskrivelse af indre operation" );
}
Timer.end( outerTimerID, "beskrivelse af ydre operation" );
Definitionen af Timer klassen har jeg smidt nederst - den skulle
være lige til at bruge.
> 2)
> Hvordan caster jeg indputtet til main classen fra string til int. Mit
> program klades med 2 parameter det ene er en string, den anden er et tal.
> Hvordan modtager jeg tallet, og putter det i en int variabel? Jeg troede at
> dette ville gøre det:
> int ant = (int) args[1];
> Hvad går der galt?
Du kan evt. kigge på nedenstående side (under "Java Programming
Language Basics"):
<
http://developer.java.sun.com/developer/onlineTraining/new2java/supplements/2002/mar02.html>
Ulrik Magnusson
/**
<pre>
Klasse til at tage tid.
int timerID = Timer.start();
doSomething();
Timer.end( timerID, "doSomething" );
</pre>
**/
public class Timer
{
private static java.util.Hashtable table = new java.util.Hashtable();
private static java.util.Hashtable pauseTable = new java.util.Hashtable();
private static int idCount = 0;
/**
Starter timer og returnerer id - se end().
*/
public static int start( )
{
Long start = new Long( System.currentTimeMillis() );
int id = idCount++;
table.put( new Integer(id), start );
return id;
}
public static int init()
{
int st = start();
pause( st );
return st;
}
/**
Sætter timer med id 'id' på pause.
Timeren må IKKE være på pause når denne kaldes.
*/
public static void pause( int id )
{
Long pauseStart = new Long( System.currentTimeMillis() );
if( isPaused(id) )
{
throw new RuntimeException( "Timer.pause() : timer " + id + " is already
paused!" );
}
pauseTable.put( new Integer(id), pauseStart );
}
/**
Sætter timer med id 'id' igang fra pause.
Timeren med det givne id SKAL være på pause.
*/
public static void resume( int id )
{
if( !isPaused(id) )
{
throw new RuntimeException( "Timer.resume() : timer " + id + " not paused!"
);
}
long paused = System.currentTimeMillis() - getPauseStart(id);
table.put( new Integer(id), new Long( getStart(id) + paused ) );
pauseTable.remove( new Integer(id) );
}
private static void removePaused( int id )
{
pauseTable.remove( new Integer(id) );
}
private static boolean isPaused( int id )
{
return pauseTable.get( new Integer(id) ) != null;
}
private static long getStart( int id )
{
Long start = (Long)table.get( new Integer(id) );
if( start == null )
{
throw new RuntimeException( "No timer with id: " + id );
}
return start.longValue();
}
private static long getPauseStart( int id )
{
Long paused = (Long)pauseTable.get( new Integer(id) );
return paused.longValue();
}
/**
Stopper timer med id 'id' og skriver 'actionDescription' og tid ud.
*/
public static void end( int id, String actionDescription )
{
long end = System.currentTimeMillis();
if( isPaused( id ) )
{
resume( id );
}
long start = getStart( id );
print( actionDescription, start, end );
}
private static void print( String actionDescription, long start, long end )
{
String str = actionDescription == null? "": actionDescription + " took ";
System.out.println( str + (end - start) + " ms." );
}
public static void main( String[] args )
{
int outerTimerID = Timer.start();
for( int i = 0; i < 10; i++ )
{
int innerTimerID = Timer.start();
Timer.end( innerTimerID, "beskrivelse af indre operation" );
}
Timer.end( outerTimerID, "beskrivelse af ydre operation" );
}
}