unglaubwürdige Messung der Zugriffszeiten

Muckefuck

Mitglied
Hallo Leute,

ich programmier zwar schon ne Weile in Java, aber für mein Problem weiss ich jetzt auch keien Lösung mehr.
Da ich eine kleine Anwendung zur Bilderkennung in Java :)D) schreibe und mir langsam die Bearbeitungszeiten bei den vielen Pixeloperationen zu lang werden, muss ich das bisher Geschriebene etwas optimieren.
Um rauszufinden, ob ich die Pixeloperationen lieber auf Arrays, Listen oder Vars mache, hatte ich flux ne kleine Klasse geschrieben, die mir das für je X Wiederholungen ausgeben sollte, und das möglichst ohne Verfälschungen durch das BS und sein Scheduling.

Als Ergebnis bekomme ich aber nur eine (fast) immer gleiche Durchschnittszugriffszeit von 1000 ns.
Und das kann ich mir beim besten Willen nicht vorstellen.

Das ist, was ich nach den letzten Codeänderungen bekam:

gib zahl ein!
45
used9109
used9448
used11354
alibival: 2114748113
arrayAccess: 1000(6 Corrections)
listAccess: 1000(18 Corrections)
varAccess: 1000(13 Corrections)
270089 Failures occurred
Da ist der Code:
Java:
package tests;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;

public class AccessComparision {

	static int var = 0;
	static int negNanoTimeFailures = 0;
	static int correction = 0;

	// 1000
	// alibival: 1496501
	// arrayAccess: 137
	// listAccess: 268
	// varAccess: 172
	// 2433 Failures occurred
	// 10000
	// alibival: 149965001
	// arrayAccess: 149
	// listAccess: 246
	// varAccess: 164
	// 24650 Failures occurred
	// 100000
	// alibival: 2114748113
	// arrayAccess: 81
	// listAccess: 89
	// varAccess: 83
	// 269552 Failures occurred

	// Zuletzt
	// 100000
	// gib zahl ein!
	// 45
	// used9109
	// used9448
	// used11354
	// alibival: 2114748113
	// arrayAccess: 1000(6 Corrections)
	// listAccess: 1000(18 Corrections)
	// varAccess: 1000(13 Corrections)
	// 270089 Failures occurred

	public static void main(String[] args) {
		//********************************************************************
		// Zur Behinderung des Optimizers
		int eingabe = 0;
		BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
		System.out.println("gib zahl ein!");
		try {
			String inLine = in.readLine();
			eingabe = Integer.parseInt(inLine.trim());
		} catch (NumberFormatException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		//********************************************************************
		int repeats = 100000;
		long arrayTime = 0;
		long varTime = 0;
		long listTime = 0;
		long[] arrayTimeArr = new long[repeats];
		long[] varTimeArr = new long[repeats];
		long[] listTimeArr = new long[repeats];
		long start = 0;
		long end = 0;
		int[] varArr = new int[repeats];
		ArrayList<Integer> varList = new ArrayList<Integer>();
		int var2 = 0;
		for (int var2Set = 0; var2Set < repeats; var2Set++) {
			varArr[var2Set] = var2;
			varList.add(new Integer(var2++));
		}
		int intResult;
		Integer integerResult = null;
		int alibiVal = 1;	// Zur Behinderung des Optimizers

		for (int i = 0; i < repeats; i++) {
			start = System.nanoTime();
			intResult = varArr[i];
			end = System.nanoTime();
			alibiVal += intResult - 2;	// Zur Behinderung des Optimizers
			arrayTimeArr[i] = end - start;

			start = System.nanoTime();
			intResult = getVar();
			end = System.nanoTime();
			var++;						//brauche nur Zugriff- nicht Zugriff+Manipulationszeit
			alibiVal += intResult + intResult;	// Zur Behinderung des Optimizers
			varTimeArr[i] = end - start;

			start = System.nanoTime();
			integerResult = varList.get(i);
			end = System.nanoTime();
			alibiVal += integerResult.intValue() - intResult;	// Zur Behinderung des Optimizers
			listTimeArr[i] = end - start;

		}
		int arrayTimeCorrections = 0;
		int varTimeCorrections = 0;
		int listTimeCorrections = 0;

		arrayTime = getAverageAccessTime(arrayTimeArr, repeats);
		arrayTimeCorrections = correction;
		correction = 0;
		varTime = getAverageAccessTime(varTimeArr, repeats);
		varTimeCorrections = correction;
		correction = 0;
		listTime = getAverageAccessTime(listTimeArr, repeats);
		listTimeCorrections = correction;
		correction = 0;

		System.out.println("alibival: " + alibiVal);	// Zur Behinderung des Optimizers
		System.out.println("arrayAccess: " + arrayTime + "(" + arrayTimeCorrections + " Corrections)");
		System.out.println("listAccess: " + listTime + "(" + listTimeCorrections + " Corrections)");
		System.out.println("varAccess: " + varTime + "(" + varTimeCorrections + " Corrections)");

		System.out.println(negNanoTimeFailures + " Failures occurred");

	}

	public static int getVar() {
		return var;
	}

	public static long getAverageAccessTime(long[] times, int repeats) {
		long res = 0;
		int usedVals = 0;
		for (int resIndex = 0; resIndex < repeats; resIndex++) {
			
			if (times[resIndex] <= 0) {//unsinnige Zugriffszeiten ignorieren
				// res += 1;
				negNanoTimeFailures++;
			} else {
				res += times[resIndex];
				usedVals++;
			}
		}
		long average = res / usedVals;
		for (int resIndex = 0; resIndex < repeats; resIndex++) {
			long current = times[resIndex];
			if (!(current <= 0)) {
				if ((current < average * 0.9) || (current > average * 1.1)) {//"Ausgleich" des BS-Scheduling 
					res -= current;
					res += average;
					correction++;
				}
			}

		}
		System.out.println("used" + usedVals);
		return res / usedVals;
	}
}

Hoffe ihr könnt das Dilemma klären, und mir Vorschläge für nen glaubwürdigen Test geben.
Bzw: kann ich den Optimizer durch eine vm-variable abschalten?


LG Muckefuck
 
G

Gelöschtes Mitglied 5909

Gast
solche microbenchmarks bringen nix.

mach statt 1er schleife bei der du 1x array, 1x list, 1x static nimmst drei schleifen und miss die drei Schleifen.

Bzw: kann ich den Optimizer durch eine vm-variable abschalten?

welchen optimizer? den jit compiler?

Code:
-Djava.compiler=NONE

// Zur Behinderung des Optimizers

Was gibt denn das wenns fertig ist?
 

Muckefuck

Mitglied
mach statt 1er schleife bei der du 1x array, 1x list, 1x static nimmst drei schleifen und miss die drei Schleifen.
Tja das wollte ich eben nicht, weil:
* ich da erstens noch die Schleifenoperationen drin hab, die ich hinterher rausrechnen muss
*und zweitens ich anschliessend mit der 2. for-schleife von getAverageAccessTime(...) die BS-Scheduling-Zeiten nicht rausrechnen kann. :(

Zitat:



// Zur Behinderung des Optimizers


Was gibt denn das wenns fertig ist?
das ist nur für euch zum zurechtfinden(ich baller ja schon gut mit vars rum^^)



Thx für die VM-Variable :toll:


BTW::D:D
eben den Fred reingestellt und schon hat google sich den gekrallt^^
attachment.php
 

Anhänge

  • 80.jpg
    80.jpg
    60,1 KB · Aufrufe: 103
G

Gelöschtes Mitglied 5909

Gast
Du berechnest BS-Scheduling Zeiten.... die kriegst du doch garnicht mit und musst du auch nicht berechnen
 

Muckefuck

Mitglied
Da hast du recht, aber wenn ich viele kleine Messungen mache, werden da ein paar ausreisser sein, die wesentlich grösser(>1.1*x (110 %)) sind als die paar nanosek die ein einzelner Zugriff sonst dauert.

So schmeiss ich die halt direkt raus und beachte sie nicht weiter.
in der Ausgabe:
arrayAccess: 1000(6 Corrections)
listAccess: 1000(18 Corrections)
varAccess: 1000(13 Corrections)
sollten die ausgegebenen Corrections die Zugriffe sein, in der mir Eclipse, Java oder halt das BS-Scheduling dazwischengepfuscht hatten.

Viele Fehler rausschmeissen macht die Ausgabe um vieles richtiger. :D:D
 
G

Gelöschtes Mitglied 5909

Gast
Wie ich schon sagte: vergiss diese mikrobenchmarks, da kannst du außerdem eh nix dran schrauben.

Dann nimmt einer die Mac OSX Java VM oder die IBM Java VM und dann ist es 3 mal langsamer

Poste lieber den Code der optimiert werden soll, da kann man dir eher helfen
 

Muckefuck

Mitglied
nagut, dann werde ich wohl ein paar mehr abfragen je durchlauf machen

hab nämlich eben nen anderen Fred gefunden, in dem das 1000er-Problem auf die accuracy vom Bs zurückzuführen ist.


Leider kann ich dir den Bilderkennungscode nicht posten, da er der firma gehört, aber falls du Anregung suchst:
Simple Bewegungserkennung mit der WebCam Florian Wilk <--- das hat mir erstmal geholfen das Quicktime-Framework zum laufen zu bringen.
Da ich vermute, dass es mit Zugriff auf Arrays wesentlich schneller geht, werde ich die Pixel-Clouds nachher aus den zeitraubenden Arraylists herausholen und in int[x][y][cloudlenght] umpacken.

nun erstmal Grillen

THX Dir
 

Muckefuck

Mitglied
So, nachdem ich gestern verstanden hab, dass System.nanoTime() gerademal zum Spekulieren gedacht ist, hab ich eben noch schnell den Code umgeschrieben(mit je 100 calls).

Hier ist das Ausgabe auf meinem System:
gib zahl ein!
858
array-Calls: used 80795
list-Calls: used 87938
Variable-Calls: used 81175
alibiVal: 1052913697
arrayAccess: 10 ns per call(58 Corrections)
listAccess: 18 ns per call(13585 Corrections)
varAccess: 14 ns per call(6254 Corrections)
2750092 nanoTime()-Failures occurred

der letzte Code:
Java:
package tests;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;

public class AccessComparision {

	static int var = 0;
	static int negNanoTimeFailures = 0;
	static int correction = 0;
	static int alibiVal = 1; // Zur Behinderung des Optimizers
	static int[] varArr = null;
	static ArrayList<Integer> varList = null;
	static int calls = 100; // Einzelaufrufe in den use-Methoden
	static double percentDiff = 1.0;
	static int repeats = 1000000;

	// 1000
	// alibival: 1496501
	// arrayAccess: 137
	// listAccess: 268
	// varAccess: 172
	// 2433 Failures occurred
	// 10000
	// alibival: 149965001
	// arrayAccess: 149
	// listAccess: 246
	// varAccess: 164
	// 24650 Failures occurred
	// 100000
	// alibival: 2114748113
	// arrayAccess: 81
	// listAccess: 89
	// varAccess: 83
	// 269552 Failures occurred

	// Zuletzt
	// 100000
	// gib zahl ein!
	// 45
	// used9109
	// used9448
	// used11354
	// alibival: 2114748113
	// arrayAccess: 1000(6 Corrections)
	// listAccess: 1000(18 Corrections)
	// varAccess: 1000(13 Corrections)
	// 270089 Failures occurred

	public static void main(String[] args) {
		// ********************************************************************
		// Zur Behinderung des Optimizers
		int eingabe = 0;
		BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
		System.out.println("gib zahl ein!");
		try {
			String inLine = in.readLine();
			eingabe = Integer.parseInt(inLine.trim());
		} catch (NumberFormatException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		// ********************************************************************
		long arrayTime = 0;
		long varTime = 0;
		long listTime = 0;
		long[] arrayTimeArr = new long[repeats];
		long[] varTimeArr = new long[repeats];
		long[] listTimeArr = new long[repeats];
		long start = 0;
		long end = 0;
		varArr = new int[repeats];
		varList = new ArrayList<Integer>();
		int var2 = 0;
		for (int var2Set = 0; var2Set < repeats; var2Set++) {
			varArr[var2Set] = var2;
			varList.add(new Integer(var2++));
		}
		int intResult;
		Integer integerResult = null;

		for (int i = 0; i < repeats; i++) {
			arrayTimeArr[i] = useArray(i);
			varTimeArr[i] = useVal();
			listTimeArr[i] = useList(i);

		}
		int arrayTimeCorrections = 0;
		int varTimeCorrections = 0;
		int listTimeCorrections = 0;

		arrayTime = getAverageAccessTime(arrayTimeArr, "array");
		arrayTimeCorrections = correction;
		correction = 0;
		listTime = getAverageAccessTime(listTimeArr, "list");
		listTimeCorrections = correction;
		correction = 0;
		varTime = getAverageAccessTime(varTimeArr, "Variable");
		varTimeCorrections = correction;
		correction = 0;

		System.out.println("alibiVal: " + alibiVal); // Zur Behinderung des Optimizers
		System.out.println("arrayAccess: " + arrayTime + " ns per call(" + arrayTimeCorrections + " Corrections)");
		System.out.println("listAccess: " + listTime + " ns per call(" + listTimeCorrections + " Corrections)");
		System.out.println("varAccess: " + varTime + " ns per call(" + varTimeCorrections + " Corrections)");

		System.out.println(negNanoTimeFailures + " nanoTime()-Failures occurred");

	}

	public static int getVar() {
		return var;
	}

	public static long getAverageAccessTime(long[] times, String accessMode) {
		long res = 0;
		int usedVals = 0;
		for (int resIndex = 0; resIndex < repeats; resIndex++) {

			if (times[resIndex] <= 0) {// unsinnige Zugriffszeiten ignorieren
				negNanoTimeFailures++;
			} else {
				res += times[resIndex];
				usedVals++;
			}
		}
		long average = (res / usedVals) / calls;
		for (int resIndex = 0; resIndex < repeats; resIndex++) {
			long current = times[resIndex] / calls;
			if (!(current <= 0)) {
				if ((current < average * (1 - percentDiff)) || (current > average * (1 + percentDiff))) {// "Ausgleich" des BS-Scheduling
					res -= current;
					res += average;
					correction++;
				}
			}

		}
		System.out.println(accessMode+"-Calls: used " + usedVals);
		return (res / usedVals) / calls;
	}

	static public long useArray(int i) {
		long res = 0;
		long start = 0;
		long end = 0;
		int intResult;
		start = System.nanoTime();
		intResult = varArr[i];
		intResult = varArr[i];
		intResult = varArr[i];
		intResult = varArr[i];
		intResult = varArr[i];
		intResult = varArr[i];
		intResult = varArr[i];
		intResult = varArr[i];
		intResult = varArr[i];
		intResult = varArr[i];
		intResult = varArr[i];
		intResult = varArr[i];
		intResult = varArr[i];
		intResult = varArr[i];
		intResult = varArr[i];
		intResult = varArr[i];
		intResult = varArr[i];
		intResult = varArr[i];
		intResult = varArr[i];
		intResult = varArr[i];
		intResult = varArr[i];
		intResult = varArr[i];
		intResult = varArr[i];
		intResult = varArr[i];
		intResult = varArr[i];
		intResult = varArr[i];
		intResult = varArr[i];
		intResult = varArr[i];
		intResult = varArr[i];
		intResult = varArr[i];
		intResult = varArr[i];
		intResult = varArr[i];
		intResult = varArr[i];
		intResult = varArr[i];
		intResult = varArr[i];
		intResult = varArr[i];
		intResult = varArr[i];
		intResult = varArr[i];
		intResult = varArr[i];
		intResult = varArr[i];
		intResult = varArr[i];
		intResult = varArr[i];
		intResult = varArr[i];
		intResult = varArr[i];
		intResult = varArr[i];
		intResult = varArr[i];
		intResult = varArr[i];
		intResult = varArr[i];
		intResult = varArr[i];
		intResult = varArr[i];
		intResult = varArr[i];
		intResult = varArr[i];
		intResult = varArr[i];
		intResult = varArr[i];
		intResult = varArr[i];
		intResult = varArr[i];
		intResult = varArr[i];
		intResult = varArr[i];
		intResult = varArr[i];
		intResult = varArr[i];
		intResult = varArr[i];
		intResult = varArr[i];
		intResult = varArr[i];
		intResult = varArr[i];
		intResult = varArr[i];
		intResult = varArr[i];
		intResult = varArr[i];
		intResult = varArr[i];
		intResult = varArr[i];
		intResult = varArr[i];
		intResult = varArr[i];
		intResult = varArr[i];
		intResult = varArr[i];
		intResult = varArr[i];
		intResult = varArr[i];
		intResult = varArr[i];
		intResult = varArr[i];
		intResult = varArr[i];
		intResult = varArr[i];
		intResult = varArr[i];
		intResult = varArr[i];
		intResult = varArr[i];
		intResult = varArr[i];
		intResult = varArr[i];
		intResult = varArr[i];
		intResult = varArr[i];
		intResult = varArr[i];
		intResult = varArr[i];
		intResult = varArr[i];
		intResult = varArr[i];
		intResult = varArr[i];
		intResult = varArr[i];
		intResult = varArr[i];
		intResult = varArr[i];
		intResult = varArr[i];
		intResult = varArr[i];
		intResult = varArr[i];
		intResult = varArr[i];
		intResult = varArr[i];
		intResult = varArr[i];
		end = System.nanoTime();
		alibiVal += intResult - 2; // Zur Behinderung des Optimizers
		res = end - start;

		return res;
	}

	static public long useList(int i) {
		long res = 0;
		long start = 0;
		long end = 0;
		Integer integerResult;
		start = System.nanoTime();
		integerResult = varList.get(i);
		integerResult = varList.get(i);
		integerResult = varList.get(i);
		integerResult = varList.get(i);
		integerResult = varList.get(i);
		integerResult = varList.get(i);
		integerResult = varList.get(i);
		integerResult = varList.get(i);
		integerResult = varList.get(i);
		integerResult = varList.get(i);
		integerResult = varList.get(i);
		integerResult = varList.get(i);
		integerResult = varList.get(i);
		integerResult = varList.get(i);
		integerResult = varList.get(i);
		integerResult = varList.get(i);
		integerResult = varList.get(i);
		integerResult = varList.get(i);
		integerResult = varList.get(i);
		integerResult = varList.get(i);
		integerResult = varList.get(i);
		integerResult = varList.get(i);
		integerResult = varList.get(i);
		integerResult = varList.get(i);
		integerResult = varList.get(i);
		integerResult = varList.get(i);
		integerResult = varList.get(i);
		integerResult = varList.get(i);
		integerResult = varList.get(i);
		integerResult = varList.get(i);
		integerResult = varList.get(i);
		integerResult = varList.get(i);
		integerResult = varList.get(i);
		integerResult = varList.get(i);
		integerResult = varList.get(i);
		integerResult = varList.get(i);
		integerResult = varList.get(i);
		integerResult = varList.get(i);
		integerResult = varList.get(i);
		integerResult = varList.get(i);
		integerResult = varList.get(i);
		integerResult = varList.get(i);
		integerResult = varList.get(i);
		integerResult = varList.get(i);
		integerResult = varList.get(i);
		integerResult = varList.get(i);
		integerResult = varList.get(i);
		integerResult = varList.get(i);
		integerResult = varList.get(i);
		integerResult = varList.get(i);
		integerResult = varList.get(i);
		integerResult = varList.get(i);
		integerResult = varList.get(i);
		integerResult = varList.get(i);
		integerResult = varList.get(i);
		integerResult = varList.get(i);
		integerResult = varList.get(i);
		integerResult = varList.get(i);
		integerResult = varList.get(i);
		integerResult = varList.get(i);
		integerResult = varList.get(i);
		integerResult = varList.get(i);
		integerResult = varList.get(i);
		integerResult = varList.get(i);
		integerResult = varList.get(i);
		integerResult = varList.get(i);
		integerResult = varList.get(i);
		integerResult = varList.get(i);
		integerResult = varList.get(i);
		integerResult = varList.get(i);
		integerResult = varList.get(i);
		integerResult = varList.get(i);
		integerResult = varList.get(i);
		integerResult = varList.get(i);
		integerResult = varList.get(i);
		integerResult = varList.get(i);
		integerResult = varList.get(i);
		integerResult = varList.get(i);
		integerResult = varList.get(i);
		integerResult = varList.get(i);
		integerResult = varList.get(i);
		integerResult = varList.get(i);
		integerResult = varList.get(i);
		integerResult = varList.get(i);
		integerResult = varList.get(i);
		integerResult = varList.get(i);
		integerResult = varList.get(i);
		integerResult = varList.get(i);
		integerResult = varList.get(i);
		integerResult = varList.get(i);
		integerResult = varList.get(i);
		integerResult = varList.get(i);
		integerResult = varList.get(i);
		integerResult = varList.get(i);
		integerResult = varList.get(i);
		integerResult = varList.get(i);
		integerResult = varList.get(i);
		integerResult = varList.get(i);
		integerResult = varList.get(i);
		integerResult = varList.get(i);
		end = System.nanoTime();
		alibiVal += integerResult.intValue() - i; // Zur Behinderung des Optimizers
		res = end - start;

		return res;
	}

	static public long useVal() {
		long res = 0;
		long start = 0;
		long end = 0;
		int intResult;
		start = System.nanoTime();
		intResult = getVar();
		intResult = getVar();
		intResult = getVar();
		intResult = getVar();
		intResult = getVar();
		intResult = getVar();
		intResult = getVar();
		intResult = getVar();
		intResult = getVar();
		intResult = getVar();
		intResult = getVar();
		intResult = getVar();
		intResult = getVar();
		intResult = getVar();
		intResult = getVar();
		intResult = getVar();
		intResult = getVar();
		intResult = getVar();
		intResult = getVar();
		intResult = getVar();
		intResult = getVar();
		intResult = getVar();
		intResult = getVar();
		intResult = getVar();
		intResult = getVar();
		intResult = getVar();
		intResult = getVar();
		intResult = getVar();
		intResult = getVar();
		intResult = getVar();
		intResult = getVar();
		intResult = getVar();
		intResult = getVar();
		intResult = getVar();
		intResult = getVar();
		intResult = getVar();
		intResult = getVar();
		intResult = getVar();
		intResult = getVar();
		intResult = getVar();
		intResult = getVar();
		intResult = getVar();
		intResult = getVar();
		intResult = getVar();
		intResult = getVar();
		intResult = getVar();
		intResult = getVar();
		intResult = getVar();
		intResult = getVar();
		intResult = getVar();
		intResult = getVar();
		intResult = getVar();
		intResult = getVar();
		intResult = getVar();
		intResult = getVar();
		intResult = getVar();
		intResult = getVar();
		intResult = getVar();
		intResult = getVar();
		intResult = getVar();
		intResult = getVar();
		intResult = getVar();
		intResult = getVar();
		intResult = getVar();
		intResult = getVar();
		intResult = getVar();
		intResult = getVar();
		intResult = getVar();
		intResult = getVar();
		intResult = getVar();
		intResult = getVar();
		intResult = getVar();
		intResult = getVar();
		intResult = getVar();
		intResult = getVar();
		intResult = getVar();
		intResult = getVar();
		intResult = getVar();
		intResult = getVar();
		intResult = getVar();
		intResult = getVar();
		intResult = getVar();
		intResult = getVar();
		intResult = getVar();
		intResult = getVar();
		intResult = getVar();
		intResult = getVar();
		intResult = getVar();
		intResult = getVar();
		intResult = getVar();
		intResult = getVar();
		intResult = getVar();
		intResult = getVar();
		intResult = getVar();
		intResult = getVar();
		intResult = getVar();
		intResult = getVar();
		intResult = getVar();
		intResult = getVar();
		intResult = getVar();
		end = System.nanoTime();
		var++; // brauche nur Zugriff- nicht Zugriff+Manipulationszeit
		alibiVal += intResult + intResult; // Zur Behinderung des Optimizers
		res = end - start;

		return res;
	}
}

Das scheinen typische Werte zu sein, die sich mit egal wievielen repeats nicht grossartig verändern.
Wer noch Fehler darin findet: BITTE POSTEN!!
Ansonsten, viel spass mit dem Code.


mfg Muckefuck
 
G

Gelöschtes Mitglied 5909

Gast
Ansonsten, viel spass mit dem Code.

sorry dass ich das jetzt sagen muss, aber mit dem code hat keiner spaß

Aber wenigstens hast du dein Problem jetzt "gelöst", obwohl das ja nix mit dem eigentlichen Code zu tun hat
 

Muckefuck

Mitglied
sorry dass ich das jetzt sagen muss, aber mit dem code hat keiner spaß

warum?

Macht jetzt das was er soll.
Hat eine verständliche Ausgabe.
Ist portierbar.
Ist im angemessenen Rahmen leicht veränderbar.
(Die chaotischen Code-Teile beschränken sich auf Bereiche, die man eh nicht anfassen soll.)


Ich seh das Problem nicht und find ihn SCHÖN:D.
 

DStrohma

Bekanntes Mitglied
Der Code ist wirklich nicht schön... Wie wärs mit einer Methode anstatt mit dreien? Also nicht useArray" & "useList", sondern nur eine Methode. Und diese jeweils 100 Zeilen in denen du immer das Gleiche machst lassen sich auch besser mit ner Schlefe machen
 

Muckefuck

Mitglied
Das Nutzen einer Schleife habe ich absichtlich von vornhinein nicht in Betracht gezogen, da ich die Zeit, die die Schleife selbst verbraucht nicht hinterher mühsam rausrechnen möchte.
Eine Methode wäre auch gegangen, aber ich wollte mir die Möglichkeit lassen das Messen von Zugriffszeiten noch auf andere Sachen auszuweiten(zB HashMaps, ...).
Da ist das neuschreiben einer weiteren Methode(zb. useHashmap, ...) wesentlich einfacher und macht den Code nicht unnötig unübersichtlicher.;)

mfg
 

DStrohma

Bekanntes Mitglied
Hmm, ich würde nie im Leben auf die Idee kommen eine for-Schleife wegzulassen weil sie bei der Zeitmessung eine Rolle spielen könnte. Das kann unmöglich mehr als eine Millisekunde dauern. Zudem kannst du gar nicht anders als die Zeit zu messen die das Programm auf der gegebenen Hardware benötigt. Bedeutet: auf jedem Computer bekommst du ein anderes Ergebnis. Wieso dann also die Schleife rausrechnen? Ergibt für mich keinen Sinn.

Und was die eine Methode angeht: du kannst eine Methode draus machen und das ganze so universell halten dass es vollkommen egal ist was du da rein steckst. Wär also egal ob Array, Liste oder irgend ne HashMap. Aber das benötigt natürlich mehr Aufwand.
 

Muckefuck

Mitglied
Selbst wenn es nur 1 ms(oder irgendeine andere vermutete zahl) ist, ist das enorm grösser als zB die ausgegeben 11ns je Arrayaufruf.
Folge: ich müsste die Durchschnittszeit für einen Schleifendurchlauf(mit blockiertem Optimizer) errechnen. -->unnötiger EXTRAAUFWAND+unnötiger EXTRACODE:noe::noe:

UND JA, mir ist vollkommen klar, dass die Ausgaben auf jedem System etwas anders sein werden aber fürs erste WAYNE.

Die Optimierung für das Bildbearbeitungsprogram(übrigens fertig :D) muss erstmal auf dem Entwicklungssystem geschehen.
Aber das benötigt natürlich mehr Aufwand.
Du musst einfach das "mehr" in "unnötigen" ändern, dann verstehst du mich hoffentlich.
 

DStrohma

Bekanntes Mitglied
Ich verstehe dich :) nur Code in der Art in der du ihn geschrieben hast, wird in einer professionellen Software nicht vorkommen. Aber letztlich reicht es bestimmt wenn es einfach nur geht ;)
 

Wortraum

Bekanntes Mitglied
Hmm, ich würde nie im Leben auf die Idee kommen eine for-Schleife wegzulassen weil sie bei der Zeitmessung eine Rolle spielen könnte. Das kann unmöglich mehr als eine Millisekunde dauern.
Nicht einmal 20.000 Durchläufe benötigen auf einem halbwegs modernen Rechner 1ms. Daran verschwendet niemand ernsthaft einen Gedanken, zumal die Zeit für Schleifendurchläufe bei der Zeitmessung eine Konstante ist.
 
Zuletzt bearbeitet:
Ähnliche Java Themen
  Titel Forum Antworten Datum
S unglaubwürdige NullPointerException Java Basics - Anfänger-Themen 4

Ähnliche Java Themen


Oben