schlechte Perfomance bei Speicherzugriffen



  • Hallo,

    ich habe mir für meine Bildverarbeitung einen 3x3 GaussFilter gebastelt. Dazu habe ich erst mittels calloc einen Speicherblock für Zwischenergebnisse (Typ double) angelegt. Meine Verarbeitung gemacht usw. Ergebnisse zurück ins Bitmap geschrieben. Funktioniert alles einwandfrei.

    Anschließend bei den Tests eine Laufzeit von 3 sec für mein Bild (640*512).

    Nun habe ich aber als Zwischenspeicher für meine Ergebnisse ein 2tes Bitmap angelegt (leider mit Datenverlust) und sie dort gespeichert. Auf diese Weise habe ich nun eine Laufzeit von nur noch 0,2 sec. Daher um Faktor 10 schneller. Hier der Code.

    void BVBitmap_Test::GaussFilter3x3Locked(BitmapData^ bmpData,Byte* row, int Xi,int Xa, int Yi, int Ya) {
    	// double * ErgebnissMx = (double*) calloc (Work->Width*Work->Height,sizeof(double));
    	Bitmap^ Ergebnis =gcnew Bitmap(Work->Height,Work->Width);
    	// Speicher Arbeitsbild locken
    	System::Drawing::Rectangle rectErg = System::Drawing::Rectangle(0,0,Ergebnis->Width,Ergebnis->Height);
    	BitmapData^ bmpDataErg =gcnew BitmapData();
    	Ergebnis->LockBits( rectErg, ImageLockMode::ReadWrite, Ergebnis->PixelFormat, bmpDataErg );
    	Byte* ErgebnissMx= (Byte*) bmpDataErg->Scan0.ToPointer();
    
    	int Gauss=0;
    	for (int i=Xi;i<Xa;i++) {
    		for (int k=Yi;k<Ya;k++) {
    			Gauss=row[i-1+(k-1)*bmpData->Stride]+2*row[i-1+k*bmpData->Stride]+row[i-1+(k+1)*bmpData->Stride];
    			Gauss=2*row[i+(k-1)*bmpData->Stride]+4*row[i+k*bmpData->Stride]+2*row[i+(k+1)*bmpData->Stride];
    			Gauss=row[i+1+(k-1)*bmpData->Stride]+2*row[i+1+k*bmpData->Stride]+row[i+1+(k+1)*bmpData->Stride];
    			ErgebnissMx[i+k*bmpDataErg->Stride]=Gauss/16;
    		}
    	}
    	for (int i=Xi;i<Xa;i++) {
    		for (int k=Yi;k<Ya;k++) {
    			row[i+k*bmpData->Stride]=ErgebnissMx[i+k*bmpDataErg->Stride];			
    		}
    	}
    	//free(ErgebnissMx);
    	Ergebnis->UnlockBits(bmpDataErg);
    }
    

    Wer kann mir Tips für einen double Zwischenspeicher geben, der in etwa genauso gut arbeitet?

    vielen Dank Mike


Anmelden zum Antworten