Performance steigern

vimar

Bekanntes Mitglied
Hallo,
wie kann ich diesen code beschleunigen? ideen waren:

Erstens: 4 threads(1 pro kern), in der innersten for schleife 4x m++ und 4 mal distance gleichzeitig berechnen.

Zweitens: Zeile 18-21 ersetzen, die distanzen in einer arraylist speichern, anschließend Collections.min(arraylist) irgendwie den index rauskriegen von dem kleinsten element und dann in "clusterid" speichern.

oder habt ihr grundlegende vorschläge. das problem ist dass bei der rechnung nur ein kern genutzt wird, diese rechnung sich gewissermaßen zwischen rechnungen befinden die mit 4 threads alle kerne auslasten. ich will permanent volle auslastung aller kerne erreichen.

vielen dank für jegliche hilfe.

tsk.jpg





Java:
for (int j = 0; j < ImageList.size(); j++){ // durch alle bilder durch
               distanz = 0;
               for (int k = 0; k < ImageList.get(j).size();k++){ // jeder vektor im bild?;P
                   
                     
                    for (int m = 0; m < clist.size(); m++){ // jeder Cluster ;P
                                  
                       if (m == 0){
                      
                        
                         clusterid = 0; // == 0                 
                         distanz = distance(clist.get(m).Centroid, ImageList.get(j).get(k));
                        // distance ist einfach nur eine abstandsfkt(manhattendistance) von 2 vektoren.
                     }// end if
                      
                         distemp = distance(clist.get(m).Centroid, ImageList.get(j).get(k));
        
                         if (distemp < distanz){
                      //       System.out.println("jow trifft zu");
                              distanz = distemp;
                              clusterid = m;
                         }//end if

                    } //end FOR m
 
Java:
public int distance(ArrayList <Integer> centroid, ArrayList <Integer> kpoint){
            
     
            int sum = 0;
            for (int i = 0; i < 128; i++){
                
              // euklid distance ohne wurzel
              //  sum = sum + (centroid.get(i) - kpoint.get(i)) * (centroid.get(i) - kpoint.get(i)) ; 

               // performance: manhatten R^1 distance
                sum = sum + Math.abs(centroid.get(i) - kpoint.get(i));
            }
           
             return sum;
        }
 
Hab doch schon mal vor einem Monat auf die Frage geantwortet.

Java:
for (int j = 0; j < ImageList.size(); j++){
//Nicht mehr 0 sondern MAX_VALUE
               distanz = Integer.MAX_VALUE;
               for (int k = 0; k < ImageList.get(j).size();k++){
                    for (int m = 0; m < clist.size(); m++){ 
//Das If (m == 0) einfach entfernen
//Ein weiterer Parameter distanz
                         distemp = distance(clist.get(m).Centroid, ImageList.get(j).get(k), distanz);
        
                         if (distemp < distanz){
                              distanz = distemp;
                              clusterid = m;
                         }
 
                    } 
}

und

Java:
        public int distance(ArrayList <Integer> centroid, ArrayList <Integer> kpoint, int minDistanz){
            int sum = 0;
            for (int i = 0; i < 128; i++){
                
              // euklid distance ohne wurzel, "War übrigens mein Vorschlag"
              //  sum = sum + (centroid.get(i) - kpoint.get(i)) * (centroid.get(i) - kpoint.get(i)) ; 
 
               // performance: manhatten R^1 distance
                
                sum = sum + Math.abs(centroid.get(i) - kpoint.get(i));
//Eine Abbruchbedingung da der exakte Wert von sum uninteressant ist, 
//wenn er größer als die bereits kleinste gefunde Distanz ist.
                if(sum>minDistanz){
                  return sum;
                }
            }           
             return sum;
        }

Erklärungen im Code. Ansonsten das GALILEO (Pro7) Motto, Sehen, Staunen, Verstehen.

Ansonsten zu den Threads.

Für jedes ImageList-Objekt einen Thread. Also schon in Zeile 2, Direkt nach der ersten for-Schleife.
 
Für Zeitkritisches könnte/sollte man auch auf autoboxing verzichten. Wie viel man hier rausholen könnte (und welche Änderungen dafür notwendig wären) ist aber schwer zu sagen.
 
jo danke!

johannes: ja ich check das jetzt mal aus! war die letzten 2 wochen verhindert und hatte keine zeit zum coden. werde das jetzt mal umsetzen! und ja ohne wurzel war von dir 😛
 
Am rande hätte man nicht eifnach cpuanzahl bilder auf einmal machen können?
dann muss nur noch der finale zugriff auf distanz jeweisl im synchronized laufen oder sehe ich das falsch?
 

Zurück
Oben