Bonjour à tous,

Je cherche à obtenir de bonne performance dans un programme C qui converti une image PNM en JPEG.

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#include <stdio.h>
#include <vips/vips.h>
//gcc -O3 -o testlibvips testlibvips.c `pkg-config vips --cflags --libs`
 
 
int main() {
    if (VIPS_INIT("testlibvips") != 0) {
        vips_error_exit("unable to start VIPS");
    }
 
    // Chemins des fichiers d'entrée et de sortie
    const char *inputFile = "/tmp/test_raw.pnm";
    const char *outputFile = "/tmp/test.jpg";
 
    // Charger l'image PNM
    VipsImage *image = vips_image_new_from_file(inputFile, NULL);
    if (image == NULL) {
        vips_error_exit("unable to load input file");
    }
 
    // Enregistrer l'image en JPEG avec une qualité de 75 et sans les informations EXIF
    if (vips_jpegsave(image, outputFile, "Q",75, "strip", TRUE,  NULL) != 0) {
        vips_error_exit("unable to save output file");
    }
 
    // Libérer la mémoire
    g_object_unref(image);
 
 
    vips_shutdown();
 
    return 0;
}
Voici ce que j'obtiens avec le programme "clé en main" de linux CJPEG
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
seb@dell:/tmp$ time taskset -c 1 cjpeg -outfile test.jpeg test_raw.pnm
 
real    0m0,014s
user    0m0,009s
sys     0m0,005s
seb@dell:/tmp$ time taskset -c 1 cjpeg -outfile test.jpeg test_raw.pnm
 
real    0m0,013s
user    0m0,012s
sys     0m0,001s
seb@dell:/tmp$ time taskset -c 1 cjpeg -outfile test.jpeg test_raw.pnm
 
real    0m0,013s
user    0m0,013s
sys     0m0,001s
seb@dell:/tmp$ time taskset -c 1 cjpeg -outfile test.jpeg test_raw.pnm
 
real    0m0,015s
user    0m0,010s
sys     0m0,005s
seb@dell:/tmp$ time taskset -c 1 cjpeg -outfile test.jpeg test_raw.pnm
 
real    0m0,018s
user    0m0,008s
sys     0m0,007s
Et avec mon programme :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
seb@dell:~/c$ time taskset -c 1 ./testlibvips
 
real    0m0,070s
user    0m0,061s
sys     0m0,009s
seb@dell:~/c$ time taskset -c 1 ./testlibvips
 
real    0m0,069s
user    0m0,057s
sys     0m0,012s
seb@dell:~/c$ time taskset -c 1 ./testlibvips
 
real    0m0,069s
user    0m0,046s
sys     0m0,023s
seb@dell:~/c$ time taskset -c 1 ./testlibvips
 
real    0m0,071s
user    0m0,054s
sys     0m0,017s
seb@dell:~/c$ time taskset -c 1 ./testlibvips
 
real    0m0,071s
user    0m0,058s
sys     0m0,013s
Je suis beaucoup plus lent. Une idée? Des instructions à ajouter à la compilation?

PS j'ai ajouté "taskset -c 1" pour effectuer le test sur 1 seul coeur mais cela ne change rien si je l'enlève.

test_raw.zip