Geschwindigkeit beim Generieren erhöhen?

Templarthelast

Bekanntes Mitglied
Für mein Tombolaspiel erzeuge mich dynamisch Spielkarten und bei einem durschschnittlichen Anfangsbestand von 125 Karten dauert das Generieren relativ lange.

Kennt ihr möglicherweise in paar Kniffe, wie ich das ganze beschleunigen könnte?

generiermethode:

Java:
	public void addCards(int amount) {
		logger.info("adding "+amount+" cards to the game");
		logger.debug("amount: " + amount);
		EntityManager em = null;
		try {

			factory = Persistence
					.createEntityManagerFactory(PERSISTENCE_UNIT_NAME);
			em = factory.createEntityManager();

			for (int i = 0; i < amount; i++) {
				
				logger.debug("i at first loop: " + i);
				Card card = new Card();
				card.setGame(game);
				int[][] numbers = new int[3][9];

				for (int k = 0; k < 3; k++) {
					for (int j = 0; j < 9; j++) {
						numbers[k][j] = -1;
					}
				}

				for (int k = 0; k < 9; k++) {
					int pos = (int) Math.floor((Math.random() * 0) + 2);
					int n = 0;
					if (k < 1) {
						n = (int) Math.floor((Math.random() * 10 * i)
								+ (9 + 10 * i));
					} else if (k < 8) {
						n = (int) Math.floor((Math.random() * (0) + 10 * i)
								+ (9 + 10 * i));
					} else if (k < 9) {
						n = (int) Math.floor((Math.random() * 80) + 90);
					}
					numbers[pos][k] = n;
				}
				for (int k = 0; k < 6; k++) {
					boolean found = false;
					int xpos = 0;
					int ypos = 0;
					do {
						found = false;

						xpos = (int) Math.floor((Math.random() * 0) + 8);
						ypos = (int) Math.floor((Math.random() * 0) + 2);

						if (numbers[ypos][xpos] != -1) {
							found = true;
						}
					} while (!found);

					boolean used = false;

					int n = 0;
					do {
						used = false;

						if (xpos < 1) {
							n = (int) Math.floor((Math.random() * 10 * i)
									+ (9 + 10 * i));
						} else if (k < 8) {
							n = (int) Math.floor((Math.random() * (0) + 10 * i)
									+ (9 + 10 * i));
						} else if (k < 9) {
							n = (int) Math.floor((Math.random() * 80) + 90);
						}

					} while (card.getUsedNumbers().contains((int) n));
					numbers[ypos][xpos] = n;

				}
				em.getTransaction().begin();
				em.persist(card);
				em.flush();
				em.getTransaction().commit();
				
			}
			// em.getTransaction().commit();
			logger.info("cards succesfull added");
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
 
Wie lange dauert das? Was GENAU dauert am längsten? Könnte man den Teil vielleicht beschleunigen?
 
Also das Erste, was man wegrationalisieren kann sind Geschichten wie "(Math.random() * 0) + X", weil das Ergebnis ist X. Das 2 dimensionale Array number macht mir auch Sorgen, weil es immer neu instanziert wird, aber anscheinend nur zum überwachen des Kartenstosses dient. könnte man in ein finales eindimensionales Array (Klassenvariable) umwandeln, welches man dann synchronisiert. Der Zugriff geschieht dann über "Zeile * numSpalten + Spalte", das Initialisieren über "Arrays.fill(numbers, -1)".
Davon mal ab... was soll diese methode denn machen? Die Karten gleich mischen?
 
Zuletzt bearbeitet von einem Moderator:
WTFIT? Also, was genau wird da erzeugt? Karten mit welchen Eigenschaften? Irgendwie habe ich das Gefühl, dass man das auch mit 5 Zeilen schreiben könnte. Und insbesondere: Was genau dieser EntityManager macht, weiß ich nicht (kein Plan von EE), aber was auch immer damit gemacht wird: Es soltle unabhängig von der Erzeugung der Karten sein. Mach' dir zwei getrennte Methoden, mit denen du sowas machen kannst wie
Java:
List<Card> cards = createCards();
parsistCards(cards);
 
Danke schonmal für den Input. Ich habe jetzt mal die einzelnen Arbeitsschritte geloggt und die Datenübertragung braucht ca ~ 670ms während die ganzen anderen Prozesse zusammen innerhalb von 1-2 ms erledigt werden.

Code:
2012-08-04 21:35:22,751 DEBUG [main] root: start -1 zuweisen
2012-08-04 21:35:22,751 DEBUG [main] root: ende -1 zuweisung und start der ersten 9
2012-08-04 21:35:22,751 DEBUG [main] root: ende der ersten 9 und start der nächsten 6
2012-08-04 21:35:22,751 DEBUG [main] root: ende der anderen 6 und start der datenbankübertragung
2012-08-04 21:35:23,422 DEBUG [main] root: ende der datenbankübertragung
 
Dann wäre es wohl am einfachsten, die Karten komplett zu erzeugen und dann in einem Schritt zu verwschicken.
So sparst du dir für dein beispiel über 80 Sekunden.
 

Neue Themen


Zurück
Oben