Hallo,
ich habe ein kleines Performanceproblem und habe auch schon den übeltäter eigentlich ausfindig gemacht. Es ist der Aufruf der clone Methode in Kombination eines casts (der glaube ich normal an der stelle ist), welcher die Laufzeit fast verdoppelt...
Allerdings verstehe ich nicht wieso meine Lösung, also mein umweg, einmal klappt und einmal nicht.
Zunächst einmal das was klappt:
Legende:
stmFilteredAMC und tempTmCandidate sind eine TreeMap<String, TreeMap<Integer, double[]>>.
Der Befehl in Zeile 2596 macht die Probleme und wurde mit der oberen for Schleife erfolgreich umschrieben.
[JAVA=2588]
for (String key2 : tempTmCandidate.keySet()) {
// nehme die kandidtaen treemap und füge alle elemente des entsprechenden frames hinzu zur
// gefilterten treemap
TreeMap<Integer,double[]> temptm2 = tempTmCandidate.get(key2);
TreeMap<Integer,double[]> newtm2 = stmFilteredAMC.get(key2);
newtm2.put(newtm2.lastKey()+1,temptm2.get(temptm2.lastKey()));
stmFilteredAMC.put(key2, newtm2);
}
//stmFilteredAMC = (TreeMap<String, TreeMap<Integer, double[]>>) tempTmCandidate.clone();
// der clone befehl dauert fast doppelt so lange wie die obere for schleife!!!
/*
[/code]
So analog dazu habe ich die innerhalb vorrausgegangener Methode einen anderen clone Befehl zu ersetzen, leider fehlerhaft, da immer nur das letzte Array sich in der TreeMap für alle keys wiederfindet. Hier sieht es so aus als würde irgendeine Referenz bestehen bleiben.
Legende:
Hier soll lediglich die TreeMap tempTm die TreeMap von stmFilteredAMC für den entsprechenden Key bekommen.
Die For-Schleife soll den auskommentierten Aufruf in Zeile 2551 ersetzen.
[JAVA=2545]
for (Integer frametemp : stmFilteredAMC.get(key).keySet()){
//hier müsste irgendwas falsch sein - auch wenn ich hier clone() verwende funktioniert es nicht richtig.
// wieso ist die forschleife nicht äquivalent zu dem clone befehl von unten? hat jemand eine idee?
double[] tmpA=stmFilteredAMC.get(key).get(frametemp)/*.clone()*/;
tempTm.put(frametemp, tmpA);
}
// tempTm = (TreeMap<Integer, double[]>) stmFilteredAMC.get(key).clone();
[/code]
Meine Frage also in Zeiel 2548 verewigt. Weiß jemand wieso die forschleife nicht äquivalent ist zu der zeile mit dem cloneaufruf?
Danke für jede Antwort.
Grüße
ich habe ein kleines Performanceproblem und habe auch schon den übeltäter eigentlich ausfindig gemacht. Es ist der Aufruf der clone Methode in Kombination eines casts (der glaube ich normal an der stelle ist), welcher die Laufzeit fast verdoppelt...
Allerdings verstehe ich nicht wieso meine Lösung, also mein umweg, einmal klappt und einmal nicht.
Zunächst einmal das was klappt:
Legende:
stmFilteredAMC und tempTmCandidate sind eine TreeMap<String, TreeMap<Integer, double[]>>.
Der Befehl in Zeile 2596 macht die Probleme und wurde mit der oberen for Schleife erfolgreich umschrieben.
[JAVA=2588]
for (String key2 : tempTmCandidate.keySet()) {
// nehme die kandidtaen treemap und füge alle elemente des entsprechenden frames hinzu zur
// gefilterten treemap
TreeMap<Integer,double[]> temptm2 = tempTmCandidate.get(key2);
TreeMap<Integer,double[]> newtm2 = stmFilteredAMC.get(key2);
newtm2.put(newtm2.lastKey()+1,temptm2.get(temptm2.lastKey()));
stmFilteredAMC.put(key2, newtm2);
}
//stmFilteredAMC = (TreeMap<String, TreeMap<Integer, double[]>>) tempTmCandidate.clone();
// der clone befehl dauert fast doppelt so lange wie die obere for schleife!!!
/*
[/code]
So analog dazu habe ich die innerhalb vorrausgegangener Methode einen anderen clone Befehl zu ersetzen, leider fehlerhaft, da immer nur das letzte Array sich in der TreeMap für alle keys wiederfindet. Hier sieht es so aus als würde irgendeine Referenz bestehen bleiben.
Legende:
Hier soll lediglich die TreeMap tempTm die TreeMap von stmFilteredAMC für den entsprechenden Key bekommen.
Die For-Schleife soll den auskommentierten Aufruf in Zeile 2551 ersetzen.
[JAVA=2545]
for (Integer frametemp : stmFilteredAMC.get(key).keySet()){
//hier müsste irgendwas falsch sein - auch wenn ich hier clone() verwende funktioniert es nicht richtig.
// wieso ist die forschleife nicht äquivalent zu dem clone befehl von unten? hat jemand eine idee?
double[] tmpA=stmFilteredAMC.get(key).get(frametemp)/*.clone()*/;
tempTm.put(frametemp, tmpA);
}
// tempTm = (TreeMap<Integer, double[]>) stmFilteredAMC.get(key).clone();
[/code]
Meine Frage also in Zeiel 2548 verewigt. Weiß jemand wieso die forschleife nicht äquivalent ist zu der zeile mit dem cloneaufruf?
Danke für jede Antwort.
Grüße