Performance slow down

"Stefan v. Wachter" <[email protected]> Wed, 30 Mar 2005 16:34:24 +0200
Newsgroups gmane.comp.video.graphicsmagick.apis
Message-ID <[email protected]>
Hello,

Usings the C- API of GraphicsMagick 1.1.5 on windows (Win2000 or XP) we 
encountered a mysterious slow down after processing of some hundreds of 
frames. The performance goes down to about 40 percent of the initial 
value. The slow down - as far as I can see - does not occurs on the 
Linux platform. There is no memory leak visible.
I modified the drawtest module (see attachment: drawtest.c and 
slowDownLog.txt) to reproduce the effect. Appearently it occurs only 
with a combination of actions i.g. annotate an image and write it to 
disk. For me it not necessarily associated with the annotate operation.
The test image I used is a 720 x 576 Grayscale TGA image.
Please tell me your opinion how to track down this problem.

Thanks in advance,
Stefan v. Wachter

ALPHA-OMEGA digital GmbH
Munich, Germany
drawtest.c (text/plain, 3.3 KB)
/*
 *
 * Test program for C drawing API
 * Written by Bob Friesenhahn
 *
 */

#if !defined(_VISUALC_)
#include <magick_config.h>
#endif
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#if defined(_VISUALC_)
#include <stdlib.h>
#include <sys\types.h>
#include <windows.h>
#endif
#include <time.h>
#include <magick/api.h>
#include <magick/color.h>

#if !defined(True)
# define True 1
#endif

#if !defined(False)
# define False 0
#endif
static void ScribbleImage ( Image *image)
{
}

int main ( int argc, char **argv )
{
  Image *theImage = (Image *)NULL;
  char infile[MaxTextExtent];
  int rows, columns = 0;
  char size[MaxTextExtent];
  ImageInfo *image_info;
  ExceptionInfo exception;
  char dummyChar;
  ImageType dummyImageType, i, ii;
  char* outfile = "outImageTemp.tga";

  
  char* theFont = "Arial";
  char* fillColor = "black";
  double fontSize = 14;
  int xPos = 20;
  int yPos = 30;
  char* theText = "TestText45897";
  DWORD dwStartTicks = 0;
  DWORD dwFinishTicks = 0;
  DWORD nTicksPer10Frames = 0;
    //CubeInfo *cube_info;

  if ( argc != 2 )
    {
      (void) printf ( "Usage: %s filename\n", argv[0] );
      exit( 1 );
    }

  (void) strncpy( infile, argv[1], MaxTextExtent-1 );

  if (LocaleNCompare("drawtest",argv[0],7) == 0)
    InitializeMagick((char *) NULL);
  else
    InitializeMagick(*argv);

  /*
   * Create canvas image
   */
/*    columns=596; */
/*    rows=842; */
  image_info=CloneImageInfo((ImageInfo*)NULL);
  GetExceptionInfo( &exception );
/*    FormatString(size, "%dx%d", columns, rows); */
/*    CloneString(&image_info->size, size); */
/*     CloneString(&image_info->size, "720 x 576");  */
  (void) strcpy( image_info->filename, infile);
  theImage = ReadImage ( image_info, &exception );
  if (exception.severity != UndefinedException)
    CatchException(&exception);
  if ( theImage == (Image *)NULL )
    {
      printf ( "Failed to read image %s\n", image_info->filename );
      exit(1);
    }


  for ( i = 0; i < 1000; i++) {
    dwStartTicks = GetTickCount();
    for ( ii = 0; ii < 10; ii++) {
      DrawContext drawContext = DrawAllocateContext ( NULL, theImage );
      DrawSetStrokeColorString (drawContext, fillColor);
//    DrawSetFillColorString (drawContext,"#000000");
//    DrawSetFillColorString (drawContext, fillColor);
      DrawSetStrokeWidth (drawContext, 1);
      DrawSetFont( drawContext, AllocateString (theFont));
      // void DrawSetFontFamily ( DrawContext context, const char *font_family ); ?
      DrawSetFontSize( drawContext, fontSize);
      DrawAnnotation ( drawContext, xPos , yPos, (unsigned char*)theText ); 
      DrawRender(drawContext);
      DrawDestroyContext(drawContext);

      /*
       * Save image to file
       */
      (void) strncpy( theImage->filename, outfile, sizeof(image_info->filename)-1);
      WriteImage ( image_info, theImage );
      // dummyImageType =GetImageType(theImage, &exception);
     // IsPaletteImage(theImage, &exception); 
      //   cube_info=GetCubeInfo();
      // DestroyCubeInfo(cube_info);
    }
    dwFinishTicks = GetTickCount();
    nTicksPer10Frames = dwFinishTicks - dwStartTicks;
    printf ( "loop: %i; nTicksPer10Frames %i\n",  i, nTicksPer10Frames);
  }
  
  DestroyExceptionInfo( &exception );
  DestroyImage( theImage );
  DestroyImageInfo( image_info );
   dummyChar = getchar();
   DestroyMagick();

  return 0;
}
slowDownLog.txt (text/plain, 8.4 KB)
loop: 0; nTicksPer10Frames 765
loop: 1; nTicksPer10Frames 360
loop: 2; nTicksPer10Frames 406
loop: 3; nTicksPer10Frames 391
loop: 4; nTicksPer10Frames 406
loop: 5; nTicksPer10Frames 406
loop: 6; nTicksPer10Frames 422
loop: 7; nTicksPer10Frames 438
loop: 8; nTicksPer10Frames 437
loop: 9; nTicksPer10Frames 453
loop: 10; nTicksPer10Frames 485
loop: 11; nTicksPer10Frames 453
loop: 12; nTicksPer10Frames 468
loop: 13; nTicksPer10Frames 454
loop: 14; nTicksPer10Frames 500
loop: 15; nTicksPer10Frames 515
loop: 16; nTicksPer10Frames 594
loop: 17; nTicksPer10Frames 500
loop: 18; nTicksPer10Frames 500
loop: 19; nTicksPer10Frames 531
loop: 20; nTicksPer10Frames 531
loop: 21; nTicksPer10Frames 594
loop: 22; nTicksPer10Frames 547
loop: 23; nTicksPer10Frames 547
loop: 24; nTicksPer10Frames 531
loop: 25; nTicksPer10Frames 547
loop: 26; nTicksPer10Frames 609
loop: 27; nTicksPer10Frames 657
loop: 28; nTicksPer10Frames 640
loop: 29; nTicksPer10Frames 578
loop: 30; nTicksPer10Frames 594
loop: 31; nTicksPer10Frames 641
loop: 32; nTicksPer10Frames 625
loop: 33; nTicksPer10Frames 609
loop: 34; nTicksPer10Frames 719
loop: 35; nTicksPer10Frames 641
loop: 36; nTicksPer10Frames 593
loop: 37; nTicksPer10Frames 625
loop: 38; nTicksPer10Frames 641
loop: 39; nTicksPer10Frames 625
loop: 40; nTicksPer10Frames 625
loop: 41; nTicksPer10Frames 641
loop: 42; nTicksPer10Frames 640
loop: 43; nTicksPer10Frames 641
loop: 44; nTicksPer10Frames 672
loop: 45; nTicksPer10Frames 656
loop: 46; nTicksPer10Frames 703
loop: 47; nTicksPer10Frames 688
loop: 48; nTicksPer10Frames 687
loop: 49; nTicksPer10Frames 672
loop: 50; nTicksPer10Frames 687
loop: 51; nTicksPer10Frames 719
loop: 52; nTicksPer10Frames 703
loop: 53; nTicksPer10Frames 703
loop: 54; nTicksPer10Frames 735
loop: 55; nTicksPer10Frames 719
loop: 56; nTicksPer10Frames 718
loop: 57; nTicksPer10Frames 797
loop: 58; nTicksPer10Frames 766
loop: 59; nTicksPer10Frames 750
loop: 60; nTicksPer10Frames 922
loop: 61; nTicksPer10Frames 812
loop: 62; nTicksPer10Frames 750
loop: 63; nTicksPer10Frames 781
loop: 64; nTicksPer10Frames 766
loop: 65; nTicksPer10Frames 797
loop: 66; nTicksPer10Frames 828
loop: 67; nTicksPer10Frames 797
loop: 68; nTicksPer10Frames 812
loop: 69; nTicksPer10Frames 844
loop: 70; nTicksPer10Frames 922
loop: 71; nTicksPer10Frames 828
loop: 72; nTicksPer10Frames 860
loop: 73; nTicksPer10Frames 859
loop: 74; nTicksPer10Frames 922
loop: 75; nTicksPer10Frames 844
loop: 76; nTicksPer10Frames 859
loop: 77; nTicksPer10Frames 891
loop: 78; nTicksPer10Frames 921
loop: 79; nTicksPer10Frames 875
loop: 80; nTicksPer10Frames 891
loop: 81; nTicksPer10Frames 875
loop: 82; nTicksPer10Frames 906
loop: 83; nTicksPer10Frames 907
loop: 84; nTicksPer10Frames 890
loop: 85; nTicksPer10Frames 922
loop: 86; nTicksPer10Frames 922
loop: 87; nTicksPer10Frames 922
loop: 88; nTicksPer10Frames 953
loop: 89; nTicksPer10Frames 969
loop: 90; nTicksPer10Frames 937
loop: 91; nTicksPer10Frames 953
loop: 92; nTicksPer10Frames 969
loop: 93; nTicksPer10Frames 969
loop: 94; nTicksPer10Frames 984
loop: 95; nTicksPer10Frames 1000
loop: 96; nTicksPer10Frames 969
loop: 97; nTicksPer10Frames 984
loop: 98; nTicksPer10Frames 985
loop: 99; nTicksPer10Frames 1015
loop: 100; nTicksPer10Frames 1000
loop: 101; nTicksPer10Frames 1000
loop: 102; nTicksPer10Frames 1016
loop: 103; nTicksPer10Frames 1016
loop: 104; nTicksPer10Frames 1015
loop: 105; nTicksPer10Frames 1031
loop: 106; nTicksPer10Frames 1125
loop: 107; nTicksPer10Frames 1063
loop: 108; nTicksPer10Frames 1047
loop: 109; nTicksPer10Frames 1344
loop: 110; nTicksPer10Frames 1171
loop: 111; nTicksPer10Frames 1125
loop: 112; nTicksPer10Frames 1110
loop: 113; nTicksPer10Frames 1156
loop: 114; nTicksPer10Frames 1266
loop: 115; nTicksPer10Frames 1172
loop: 116; nTicksPer10Frames 1250
loop: 117; nTicksPer10Frames 1265
loop: 118; nTicksPer10Frames 1188
loop: 119; nTicksPer10Frames 1203
loop: 120; nTicksPer10Frames 1172
loop: 121; nTicksPer10Frames 1203
loop: 122; nTicksPer10Frames 1265
loop: 123; nTicksPer10Frames 1579
loop: 124; nTicksPer10Frames 1218
loop: 125; nTicksPer10Frames 1282
loop: 126; nTicksPer10Frames 1265
loop: 127; nTicksPer10Frames 1235
loop: 128; nTicksPer10Frames 1250
loop: 129; nTicksPer10Frames 1265
loop: 130; nTicksPer10Frames 1328
loop: 131; nTicksPer10Frames 1266
loop: 132; nTicksPer10Frames 1297
loop: 133; nTicksPer10Frames 1265
loop: 134; nTicksPer10Frames 1297
loop: 135; nTicksPer10Frames 1328
loop: 136; nTicksPer10Frames 1266
loop: 137; nTicksPer10Frames 1281
loop: 138; nTicksPer10Frames 1313
loop: 139; nTicksPer10Frames 1328
loop: 140; nTicksPer10Frames 1328
loop: 141; nTicksPer10Frames 1328
loop: 142; nTicksPer10Frames 1344
loop: 143; nTicksPer10Frames 1359
loop: 144; nTicksPer10Frames 1375
loop: 145; nTicksPer10Frames 1375
loop: 146; nTicksPer10Frames 1328
loop: 147; nTicksPer10Frames 1407
loop: 148; nTicksPer10Frames 1390
loop: 149; nTicksPer10Frames 1360
loop: 150; nTicksPer10Frames 1422
loop: 151; nTicksPer10Frames 1406
loop: 152; nTicksPer10Frames 1437
loop: 153; nTicksPer10Frames 1422
loop: 154; nTicksPer10Frames 1406
loop: 155; nTicksPer10Frames 1438
loop: 156; nTicksPer10Frames 1391
loop: 157; nTicksPer10Frames 1500
loop: 158; nTicksPer10Frames 1421
loop: 159; nTicksPer10Frames 1469
loop: 160; nTicksPer10Frames 1453
loop: 161; nTicksPer10Frames 1485
loop: 162; nTicksPer10Frames 1437
loop: 163; nTicksPer10Frames 1547
loop: 164; nTicksPer10Frames 1484
loop: 165; nTicksPer10Frames 1516
loop: 166; nTicksPer10Frames 1484
loop: 167; nTicksPer10Frames 1579
loop: 168; nTicksPer10Frames 1468
loop: 169; nTicksPer10Frames 1532
loop: 170; nTicksPer10Frames 1484
loop: 171; nTicksPer10Frames 1562
loop: 172; nTicksPer10Frames 1485
loop: 173; nTicksPer10Frames 1594
loop: 174; nTicksPer10Frames 1515
loop: 175; nTicksPer10Frames 1594
loop: 176; nTicksPer10Frames 1562
loop: 177; nTicksPer10Frames 1610
loop: 178; nTicksPer10Frames 1594
loop: 179; nTicksPer10Frames 1562
loop: 180; nTicksPer10Frames 1609
loop: 181; nTicksPer10Frames 1594
loop: 182; nTicksPer10Frames 1594
loop: 183; nTicksPer10Frames 1609
loop: 184; nTicksPer10Frames 1563
loop: 185; nTicksPer10Frames 1640
loop: 186; nTicksPer10Frames 1625
loop: 187; nTicksPer10Frames 1625
loop: 188; nTicksPer10Frames 1688
loop: 189; nTicksPer10Frames 1641
loop: 190; nTicksPer10Frames 1640
loop: 191; nTicksPer10Frames 1703
loop: 192; nTicksPer10Frames 1672
loop: 193; nTicksPer10Frames 1656
loop: 194; nTicksPer10Frames 1688
loop: 195; nTicksPer10Frames 1641
loop: 196; nTicksPer10Frames 1687
loop: 197; nTicksPer10Frames 1703
loop: 198; nTicksPer10Frames 1703
loop: 199; nTicksPer10Frames 1703
loop: 200; nTicksPer10Frames 1719
loop: 201; nTicksPer10Frames 1813
loop: 202; nTicksPer10Frames 1687
loop: 203; nTicksPer10Frames 1750
loop: 204; nTicksPer10Frames 1750
loop: 205; nTicksPer10Frames 1797
loop: 206; nTicksPer10Frames 1719
loop: 207; nTicksPer10Frames 1750
loop: 208; nTicksPer10Frames 1765
loop: 209; nTicksPer10Frames 1813
loop: 210; nTicksPer10Frames 1734
loop: 211; nTicksPer10Frames 1782
loop: 212; nTicksPer10Frames 1859
loop: 213; nTicksPer10Frames 1797
loop: 214; nTicksPer10Frames 1812
loop: 215; nTicksPer10Frames 1891
loop: 216; nTicksPer10Frames 1766
loop: 217; nTicksPer10Frames 1812
loop: 218; nTicksPer10Frames 1828
loop: 219; nTicksPer10Frames 1844
loop: 220; nTicksPer10Frames 1844
loop: 221; nTicksPer10Frames 1875
loop: 222; nTicksPer10Frames 1828
loop: 223; nTicksPer10Frames 1844
loop: 224; nTicksPer10Frames 1890
loop: 225; nTicksPer10Frames 1922
loop: 226; nTicksPer10Frames 1875
loop: 227; nTicksPer10Frames 1922
loop: 228; nTicksPer10Frames 1937
loop: 229; nTicksPer10Frames 1891
loop: 230; nTicksPer10Frames 1906
loop: 231; nTicksPer10Frames 1875
loop: 232; nTicksPer10Frames 1953
loop: 233; nTicksPer10Frames 1907
loop: 234; nTicksPer10Frames 1953
loop: 235; nTicksPer10Frames 1984
loop: 236; nTicksPer10Frames 1938
loop: 237; nTicksPer10Frames 1968
loop: 238; nTicksPer10Frames 1969
loop: 239; nTicksPer10Frames 2000
loop: 240; nTicksPer10Frames 1969
loop: 241; nTicksPer10Frames 1969
loop: 242; nTicksPer10Frames 2047
loop: 243; nTicksPer10Frames 2046
loop: 244; nTicksPer10Frames 2079
loop: 245; nTicksPer10Frames 2000
loop: 246; nTicksPer10Frames 2125
loop: 247; nTicksPer10Frames 2046
loop: 248; nTicksPer10Frames 2047
loop: 249; nTicksPer10Frames 2110
loop: 250; nTicksPer10Frames 2047
loop: 251; nTicksPer10Frames 2031
loop: 252; nTicksPer10Frames 2094
loop: 253; nTicksPer10Frames 2031
loop: 254; nTicksPer10Frames 2156
loop: 255; nTicksPer10Frames 2063
loop: 256; nTicksPer10Frames 2171
loop: 257; nTicksPer10Frames 2344