jedes x-te Byte kopieren



  • Hallo an alle C++ Profis!

    Ich habe ein "Problem". Ich muss MÖGLICHST performant jedes x-te Byte aus einem Quell-Speicherbereich in einen Ziel-Speicherbereich kopieren.
    Bis her mache ich das mit einer doppelt geschachtelten Schleife. Da diese aber zu wenig performant ist, wäre es schön wenn irgendjemand eine Idee für eine art "maskierten" copy Befehl hätte. Also dem man z.B. angeben könnte, kopiere ab dem Pointer p jedes X-te Byte nach p2.

    Bisher ist das ganze folgendermaßen gelöst:

    long virtHeight = mColorImage->height*mColorImage->resolution;
    		long virtWidth = mColorImage->width*mColorImage->resolution;
    
    		for(long y=0;y<virtHeight;y+=mColorImage->resolution)
    		{
    			for(long x=0;x<virtWidth;x+=mColorImage->resolution)
    			{
    				if(i<=size)
    				{
    					mColorImage->rgbData[i*3] = *(ptr + y * width + x);
    					mColorImage->rgbData[i*3+1] = *(ptr + y * width + x);
    					mColorImage->rgbData[i*3+2] = *(ptr + y * width + x);
    					i++;
    				}
    				else
    					break;
    
    			}
    		}
    

    Vielen Dank schonmal für eure Anregungen!

    Grüße Michael


  • Mod

    So etwas gibt es nicht. Aber warum überlässt Du ale Optimierungen dem Compiler.
    Spare doch selbst in dem Du Berechnungen wegoptimierst

    PBYTE *pTarget = mColorImage->rgbData;
    for(long y=0;y<virtHeight;y+=mColorImage->resolution)
    {
       BYTE *pRow = ptr+y*width;
       for(long x=0;x<virtWidth;x+=mColorImage->resolution)
       {
           if(i<=size)
           {
               pTarget[0] = pTarget[1] = pTarget[2] = pRow;
               pTarget += 3;
               ++i;
           }
           else
               break;               
        }
    }
    

    Aber sind hier nicht einige Variablen redundant?



  • Hallo Martin!

    Danke Dir für die Antwort! Werde ich mal testen ob das nen Performancegewinn ergibt und dann berichten!

    Grüße Michael


  • Mod

    Im Release Mode wird es kaum was bringen, im Debug Mode sicherlich.



  • Also bringt so gut wie garnichts - weder im Debug noch im Release Mode...
    Aber trotzdem danke!
    Grüße Michael



  • Brauchst du den Check auf "i <= size" wirklich?
    Wie wär's mit sowas in der Art:

    size_t const height = mColorImage->height;
    	size_t const width = mColorImage->width;
    	size_t const stride = mColorImage->resolution;
    
    	unsigned char* destptr = mColorImage->rgbData;
    
    	size_t const tocopy = width * height;
    
    	for (size_t i = 0; y < tocopy; ++i)
    	{
    		char const value = *ptr;
    		ptr += stride;
    
    		destptr[0] = value;
    		destptr[1] = value;
    		destptr[2] = value;
    		destptr += 3;
    	}
    

    Auf jeden Fall würde ich das mColorImage->resolution aus der inneren Schleife rausziehen. Der Compiler kann das u.U. nicht optimieren, da du Zeiger verwendest, und er daher meist Aliasing nicht ausschliessen kann.


Anmelden zum Antworten