It seems that IM6.9.9 would use much more time in GetMagickInfo() so that the Semaphore Lock would occupy more time. The following code would use almost 700% CPU when using 6.7.2 but only 140% when it is 6.9.9. I believe there must be something wrong when the magick_list SplayTree is used.
Code: Select all
#include <stdio.h>
#include <fstream>
#include <iostream>
#include <string>
#include <pthread.h>
#include <wand/magick_wand.h>
void ReadJpgFile(const char *filename, unsigned char *&buff, size_t &size)
{
std::ifstream infile;
infile.open(filename);
infile.seekg(0, std::ios::end);
size = infile.tellg();
infile.seekg(0, std::ios::beg);
buff = new unsigned char[size];
infile.read((char *)buff, size);
infile.close();
}
void WriteJpgFile(const char *filename, unsigned char *buff, size_t size)
{
std::ofstream fout; // create an ofstream object named fout
fout.open(filename,std::ios::trunc);
fout.write((char *)buff,size);
fout.close();
}
void CompressJpgUsingImageMagick(unsigned char *orig_buff, unsigned char *&buff, size_t &img_size)
{
MagickWand *im = NULL;
im = NewMagickWand();
MagickReadImageBlob(im, (const unsigned char *)orig_buff, img_size);
//for(int i = 0; i < 5000000; i++);
// MagickResetIterator(im);
// MagickSetImageCompressionQuality(im, 50);
// double factors420[3] = {2.0, 1.0, 1.0};
// MagickSetSamplingFactors(im, 3, factors420);
// //MagickSetInterlaceScheme(im, LineInterlace);
// MagickSetImageFormat(im, "jpg");
// MagickStripImage(im);
// if(buff != NULL) free(buff);
// img_size = 0;
// buff = (unsigned char *)MagickGetImageBlob(im, &img_size);
DestroyMagickWand(im);
}
void* WholeJpegCompress(void*)
{
unsigned char *orig_buff = NULL;
unsigned char *buff = NULL;
size_t ori_img_size = 0;
size_t img_size = 0;
for(int i = 0; i < 1; i++)
{
ReadJpgFile("1.jpg",orig_buff,ori_img_size);
for(int j = 0; j < 5000000; j++)
{
img_size = ori_img_size;
if(buff != NULL)
{
free(buff);
buff = NULL;
}
CompressJpgUsingImageMagick(orig_buff,buff,img_size);
}
//WriteJpgFile("2.jpg",buff,img_size);
printf("outsize: %d\n",img_size);
free(buff);
buff = NULL;
delete orig_buff;
orig_buff = NULL;
}
pthread_exit(0);
return NULL;
}
void* EmptyRun(void*)
{
int i = 0;
while(i < 1000000000)
{
int j = 0;
while(j < 100) j++;
i++;
}
pthread_exit(0);
}
int main()
{
pthread_t deal_thr[7];
for(int i = 0; i < 7; i ++)
{
int ret=pthread_create(&deal_thr[i],NULL,WholeJpegCompress,NULL);
if(ret!=0)
{
printf("Create pthread error!\n");
return -1;
}
}
for(int i = 0; i < 7; i ++)
{
pthread_join(deal_thr[i],NULL);
}
return 0;
}