passere metode som parameter

Du kan i dette forum stille og svare på spørgsmål vedrørende Java programmering på alle typer platforme.
Besvar
cristian
Moderator
Moderator
Indlæg:882
Tilmeldt:26. sep 2011, 21:31
Kontakt:
passere metode som parameter

Indlæg af cristian » 28. apr 2017, 14:22

Fra tid til anden så vil jeg gerne vide hvor lang tid en metode er om at eksekvere i min kode,
så jeg tænkte at det måtte være muligt at lave en time() metode der kunne tage en anden metode som parameter.

Dette inkluderede anonyme klasser, så det gik jeg hurtigt væk fra og over til lambda.
Er der nogle der kender en bedre metode end dette til at opnå samme resultat?

Kode: Vælg alt

public class Main {
	public static void main(String[] args) {
		MethodExecution me = new MethodExecution();
//		Execute a command in the Main class from the MethodExecution class, so we can time it.
		System.out.println(me.methodExecutionTime(()-> Main.command1()));
	}
	
	public static void command1() {
		int min = 1200;
		int max = 2200;
		
		try {
			Thread.sleep(ThreadLocalRandom.current().nextInt(min, max +1));
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		
		System.out.println("command1 output");
	}
}

class MethodExecution {
	
	public int methodExecutionTime(Runnable function) {
		long startTime = System.nanoTime();

		function.run();
		
		long stoptime = System.nanoTime();
		return (int) (TimeUnit.MILLISECONDS.convert((stoptime - startTime), TimeUnit.NANOSECONDS));
	}
}
output
command1 output
1938

jepperask
Geni
Geni
Indlæg:378
Tilmeldt:4. nov 2012, 17:57

Re: passere metode som parameter

Indlæg af jepperask » 29. apr 2017, 22:25

cristian skrev:Fra tid til anden så vil jeg gerne vide hvor lang tid en metode er om at eksekvere i min kode,
så jeg tænkte at det måtte være muligt at lave en time() metode der kunne tage en anden metode som parameter.

Dette inkluderede anonyme klasser, så det gik jeg hurtigt væk fra og over til lambda.
Er der nogle der kender en bedre metode end dette til at opnå samme resultat?

Kode: Vælg alt

public class Main {
	public static void main(String[] args) {
		MethodExecution me = new MethodExecution();
//		Execute a command in the Main class from the MethodExecution class, so we can time it.
		System.out.println(me.methodExecutionTime(()-> Main.command1()));
	}
	
	public static void command1() {
		int min = 1200;
		int max = 2200;
		
		try {
			Thread.sleep(ThreadLocalRandom.current().nextInt(min, max +1));
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		
		System.out.println("command1 output");
	}
}

class MethodExecution {
	
	public int methodExecutionTime(Runnable function) {
		long startTime = System.nanoTime();

		function.run();
		
		long stoptime = System.nanoTime();
		return (int) (TimeUnit.MILLISECONDS.convert((stoptime - startTime), TimeUnit.NANOSECONDS));
	}
}
output
command1 output
1938
Jeg tror det er den rette vej at gå, da Runnable nok er det tætteste du kommer på en void -> void delegate i Java. Ellers kunne du overveje unit-testing, hvor værktøjerne ofte har en form for indbygget tidstagning, code-coverage mm.

cristian
Moderator
Moderator
Indlæg:882
Tilmeldt:26. sep 2011, 21:31
Kontakt:

Re: passere metode som parameter

Indlæg af cristian » 13. maj 2017, 16:09

Takker Jeppe

Besvar