Programm seeehr lannnngsaaaaammmm.

Status
Nicht offen für weitere Antworten.

automatix

Aktives Mitglied
Hallo!

Ich hab ein winziges und trotzdem sehr langsames Programmchen geschrieben... 🙂 Um ein 2D-Array 10x10 zu erzeugen, es mit Zufallswerten zu füllen und formatiert auszugeben, braucht es mehr als 10 Sekunden.

Wie kann man herausfinden, warum ein Programm langsam ist?
 
eine simple Möglichkeit:

mit einem schnellen Programm anfangen wie ein Hello-World-Programm,
wenn das auch lahm ist, dann liegst zumindest nicht am Inhalt des Programms 😉

ansonsten:
Schritt für Schritt den anderen Code einfügen/ aktivieren, bis es auf einmal lange dauert,
dann anschauen und mit dem Kopf verstehen, was sich seit dem letzten Schritt geändert hat,

evtl. mit Debugger oder System.out.println()-Meldungen prüfen,
ob Schleifen nicht länger durchlaufen werden als sie sollen,
wie genau sich die Zeit verteilt usw.

wenns nicht weiter geht, dann andere fragen
 
automatix hat gesagt.:
Um ein 2D-Array 10x10 zu erzeugen, es mit Zufallswerten zu füllen und formatiert auszugeben, braucht es mehr als 10 Sekunden.

Glaub ich nicht:
Code:
long start = System.currentTimeMillis();
Random random = new Random();
int[][] array = new int[10][10];
for(int i = 0 ; i < array.length; i++){
	for(int j = 0; j < array[i].length; j++) {
		array[i][j] = random.nextInt();
	}
}
System.out.println(System.currentTimeMillis() - start);

brauch ca 1 ms.

sowas könnte das:
http://www.eclipse.org/tptp/

Aber da das Programm ja noch kein ist, wohl eher mit Kanonen auf Spatzen...
 
Quatsch, und wenn dann solltest du wenigstes ne halbe Minute warten,
weil dann bei so einem einfachen Thema eh schon jeweils 5 Antworten kommen,

so schnell kannst du gar nicht kopieren, bis der erste seine Antwort abgeschickt hat haben andere zumindest schon angefangen zu schreiben

es führt also letztlich wie bei allen Crosspostings zu doppelter nutzloser Arbeit,
danke schön
 
automatix hat gesagt.:
Hallo!

Ich hab ein winziges und trotzdem sehr langsames Programmchen geschrieben... 🙂 Um ein 2D-Array 10x10 zu erzeugen, es mit Zufallswerten zu füllen und formatiert auszugeben, braucht es mehr als 10 Sekunden.

Wie kann man herausfinden, warum ein Programm langsam ist?

grundsätzlich, poste mal dein programm, da ist sicher eine kleinigkeit falsch...
 
OK, teilweise habt Ihr vielleicht doch Recht -- man sollte keine "einfachen" Fragen in mehreren Foren posten. Grundsätzlich find ich es aber, wie gesagt, OK, dass man in mehreren Foren fragt und anschließend, wenn ne gute Lösung gefunden, diese in mehreren Foren postet. So hat jeder was davon -- der, der fragt, kriegt mehr Feedback aus unterschiedlichen Perspektiven und die Foren werden jeweils um einen gelösten Thread reicher.
 
Poste in Zukunft den Link zu dem Forum, wo du Crosspostest einfach dazu (in beiden Foren). Und du wirst zumindest von mir keine Kritik mehr bekommen 😉 .
 
Hobbit_Im_Blutrausch hat gesagt.:
Poste in Zukunft den Link zu dem Forum, wo du Crosspostest einfach dazu (in beiden Foren). Und du wirst zumindest von mir keine Kritik mehr bekommen 😉 .
Ich mach das normalerweise, wenn schon ein paar interschiedliche interessante Ansätze da sind und zum Teil durchdiskutiert wurden. Der Gedanke ist, dass diejenigen, die die Threads auf anderen Foren nicht verfolgen, erstmal ihre eigenen Lösungen darstellen, ohne von denen auf anderen Foren beeinflusst zu werden. Dadurch entsteht eine Ideenvielfalt, und dann kann man querverlinken und sagen, über das Problem wird nocht hier, hier und hier diskutiert... 🙂
 
mich würd interessieren, warum dein programm so lange, braucht, könntest du bitte mal den code posten?
 
Es liegt an der while-Schleife meines Zufallszahlengenerators.

Code:
package matrix_calculator;

import utils.ArrayUtility;

public class MatrixCalcMain {
	
	public static void main(String[] args) {
		
		int[][]arr = new int[10][10];
		ArrayUtility.initializeArray(arr, -1000, 1000);
		ArrayUtility.printArray(arr);
		
	}
	
}
Code:
package utils;

/**
Sammlung von Dienstleistern für die Arbeit mit Array.
*/
public class ArrayUtility {

	/**
	Initialisiert
		alle Sub-Arrays der Elemente des Arrays arr
		mit Zufallswerten aus dem Interval
			[min,
			max]
	.
	@param arr
	@param min
	@param max
	*/
	public static void initializeArray(int[][] arr, int min, int max) {
		initializeArray(arr, 0, arr.length - 1, min, max);
	}
	
	/**
	Initialisiert
		die Sub-Arrays der Elemente des Arrays arr
			von startIndex
			bis stopIndex
		mit Zufallswerten aus dem Interval
			[min,
			max]
	.
	@param arr
	@param startIndex
	@param stopIndex
	@param min
	@param max
	*/
	public static void initializeArray(int[][] arr, int startIndex, int stopIndex, int min, int max) {
		boolean inputOk =
			(arr != null) &&
			(0 <= startIndex) &&
			(startIndex <= stopIndex) &&
			(stopIndex <= arr.length - 1)
		;
		if (inputOk) {
			for (int[] element : arr) {
				initializeArray(element, min, max);
			}
		}
	}
	
	/**
	DONE Initialisiert
		alle Elemente des Arrays arr
		mit Zufallswerten aus dem Interval
			[min,
			max]
	.
	@param arr
	@param startIndex
	@param stopIndex
	@param min
	@param max
	*/
	public static void initializeArray(int[] arr, int min, int max) {
		initializeArray(arr, 0, arr.length - 1, min, max);
	}
	
	/**
	DONE Initialisiert
		die Elemente des Arrays arr
			von startIndex
			bis stopIndex
		mit Zufallswerten aus dem Interval
			[min,
			max]
	.
	@param arr
	@param startIndex
	@param stopIndex
	@param min
	@param max
	*/
	public static void initializeArray(int[] arr, int startIndex, int stopIndex, int min, int max) {
		boolean inputOk =
			(arr != null) &&
			(0 <= startIndex) &&
			(startIndex <= stopIndex) &&
			(stopIndex <= arr.length - 1)
		;
		if (inputOk) {
			ExtendedRandom randomNum = new ExtendedRandom();
			for (int i = startIndex; i <= stopIndex; i++) {
				arr[i] = randomNum.nextInt(min, max);
			}	
		} else {
			throw new IllegalArgumentException();
		}
	}
	
	/**
	TODO
	Schreibt das Array arr auf die Konsole.
	Die Gestaltung der Ausgabe einzelner "Array-Zeilen" ist
		in #{@link ArrayUtility#printArray(int[])} beschrieben.
	Die Trennzeichenkette für die Abgrenzung der eintzelnen "Array-Zeilen" voneinander ist
		eine Leerzeile ("\n").
	@param arr
	*/
	public static void printArray(int[][] arr) {
		int lengthOfLongestIntegerPart = getLengthOfLongestIntegerPart(arr);
		for (int i = 0; i < arr.length; i++) {
			printArray(arr[i], "%" + (lengthOfLongestIntegerPart + 1) + "d");
			System.out.print("\n");
		}
	}
	
	/**
	DONE Ermittelt die Länge des längsten Elements und
	gibt sie zurück.
	@param arr
	@return die Länge des längsten Elements
	 */
	public static int getLengthOfLongestIntegerPart(int[][] arr) {
		int longestIntegerPart = 1;
		for (int[] i : arr) {
			for (int j : i) {
				if ((j + "").length() > longestIntegerPart) {
					longestIntegerPart = (j + "").length();
				}
			}	
		}
		return longestIntegerPart;
	}
	
	/**
	DONE
	Schreibt das Array arr auf die Konsole.
	Die Gestaltung der Ausgabe kann über den Input-Parameter format angepasst werden.
	Der String format ist beschrieben in [url="../util/Formatter.html#syntax"]Format string syntax[/url]
	@param arr
	@param format
	@see java.io.PrintStream#printf(String, Object...)
	*/
	public static void printArray(int[] arr, String format) {
		for (int element : arr) {
			System.out.printf(format, element);
		}
	}
	
}
Code:
package utils;

import java.util.Random;
 
public class ExtendedRandom extends Random {
	 
	public ExtendedRandom() {
		super();
	}
	
	/**
	Liefert eine ganze Zufallszahl aus dem Bereich [min; max].
	@param min
	@param max
	@return
	*/
	public int nextInt(int min, int max) {
		int num = nextInt();
		while (num < min || num > max) {
			num = nextInt();
		}
		return num;
	}
	
}
 
Code:
   public int nextInt(int min, int max) {
      int num = nextInt();
      while (num < min || num > max) {
         num = nextInt();
      }
      return num;
   }

Voll am Ziel vorbei geschossen (das kann dauern)

return nextInt(max - min) + min

EDIT:
Ohne was anderes angeschaut zu haben ausser der Random Klasse)
 
Grübel grübel....
..guck in die API
uniformly distributed int value between 0 (inclusive) and the specified value (exclusive)


ja (wenn bis und mit max)
 
Ja, das war es!
Code:
package utils;

import java.util.Random;
 
public class ExtendedRandom extends Random {
	 
	public ExtendedRandom() {
		super();
	}
	
	/**
	Liefert eine ganze Zufallszahl aus dem Bereich [min; max].
	@param min
	@param max
	@return
	*/
	public int nextInt(int min, int max) {
//		NEVER AGAIN!!! :)
//		int num = nextInt();
//		while (num < min || num > max) {
//			num = nextInt();
//		}
//		return num;
		return nextInt(max - min + 1) + min;
	}
	
}
Vielen Dank!

P.S. Hier die Links zu diesem Thema auf anderen Foren:
java.de
forum.javacore.de
tutorials.de/forum/
tutorium.mbeier.org/forum
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben