Grosse différence de performance entre un CGI en C et C++ - C++ - Programmation
Marsh Posté le 26-04-2003 à 07:36:40
ton code C++ est ok (sauf le passage par pointeur qui sert à rien, en C comme en C++, et à koi sert ce bloc supplémentaire dans le main. combien de test à tue effectué? quelles options de compilations?
cela dit, meme en C, ça me parait tres lent
Marsh Posté le 26-04-2003 à 07:59:49
J'ai compilé avec :
g++ -s -Os test.cpp -o cpp
gcc -s -Os test.c -o cc
Sinon le bloc supplémentaire, c'est pour libérer la mémoire à la fin, comme si les variables qu'il contient avaient été déclarées dans un if.
Enfin, je crois que bien que ça fait ça.
C'est vrai que c'est lent, mais n'oublie pas la machine : PII 400 MHz.
Et oui, j'ai fait et refais les tests. Idem.
Marsh Posté le 26-04-2003 à 08:21:38
essaye avec -03
quelle est la version de ton compilateur?
edit: pour etre strictement équivalent au C, il faut remplacer tes chaines à un caracteres "[" par un caractere '['
Marsh Posté le 26-04-2003 à 08:34:20
J'utilise GCC 3.2.
Si je remplace " par ' et compile avec -03, ça ne donne rien de vraiment mieux :
Code :
|
En tout cas, merci de m'aider.
Marsh Posté le 26-04-2003 à 08:41:04
de toutes façons, tu es confronté à un problème bien connu. la médiocrité de l'implémenation de E/S C++
si tu veux continuer à faire en C++, mais que les ostream sont vraiment trop lent à ton gout, continue à utiliser stdio.h avec quelque précautions: en debut de programme tu rajoutes
std::ios_base::sync_with_stdio();
pour assurer la cohérence iostream/cstdio
Marsh Posté le 26-04-2003 à 08:54:30
Je me demande si mon g++, n'a pas un problème. Parce que si je compile mon programme C (sans rien changer) avec g++ ça me donne :
Code :
|
J'en déduis donc (à tort ?) que les problèmes d'E/S, ne sont responsables que d'un tiers du ralentissement.
Marsh Posté le 26-04-2003 à 09:05:08
yep, bizarre....
Marsh Posté le 26-04-2003 à 09:12:57
c'est vrai que y a un truc là. le code assembleur est exactement le meme pourtant. tu veux pas faire des tests 50 fois plus long pour avoir des chiffres plus precis
Marsh Posté le 26-04-2003 à 09:37:23
J'ai pas fait des tests 50 fois plus longs, mais bien 10 fois, et c'est pareil. Les résultats sont d'ailleurs très réguliers.
Et les fichiers binaires sont bien différents :
avec g++ : 3368 Ko
avec gcc : 3052 Ko
Il s'agit du même code source.
D'ailleurs ces deux fichiers ne sont pas un peu gros ?
Edit: En fait c'est :
avec g++ : 3368 octets
avec gcc : 3052 octets
Halala, je devrais me relire des fois.
Marsh Posté le 26-04-2003 à 09:51:02
voir énormes!!!!! donne moi ta ligne de compilation s'il te plait
Marsh Posté le 26-04-2003 à 09:57:25
Merde, j'ai mal dormi moi... C'est des octets et non des Ko.
Excuse-moi.
Marsh Posté le 26-04-2003 à 19:13:12
Les objets standard du C++ ne valent pas un clou. A refaire.
Il me semble que le mécanisme CGI est mauvais.
Marsh Posté le 26-04-2003 à 20:47:29
++Taz a écrit : ou t'as vu un objet la? |
"cout" dans le cas de son prog en C++
Marsh Posté le 27-04-2003 à 03:47:41
J'ai essayé G++ 2.96, et le programme C++ compilé est 2.5 fois plus rapide qu'avec G++ 3.2 !!! Ce qui me donne un programme « seulement » 40 % plus lents que celui en C (rapport 5 à 7).
De plus, la compilation est quasiment instantanée avec G++ 2.96 alors qu'elle met quelques secondes avec G++ 3.2.
Ça vient peut-être de ma conf (par défaut, j'y ai pas touché) :
Code :
|
Je ferais bien des tests, mais je n'ai pas compris où et comment modifier ça.
Marsh Posté le 27-04-2003 à 03:49:36
Sr16 a écrit : Les objets standard du C++ ne valent pas un clou. A refaire. |
Si les mécanismes object de C++ ne valent rien, quel langage object et rapide choisir ? Pareil pour les CGI, y a pas d'alternative ?
Marsh Posté le 27-04-2003 à 08:33:48
essaye de voir sur le site de gcc si d'autres personnes constatent ce problème ou s'il y a eu un rapport de bug
Marsh Posté le 26-04-2003 à 05:29:05
J'ai voulu testé si ça valait le coup de réécrire un CGI Perl en C++. Et surprise, c'etait presque pareil !
J'ai alors codé un petit CGI de test en C, C++ et Perl.
J'ai testé ses performances avec la commande (sous Apache + Linux) :
# ab -n500 http://localhost/cgi-bin/programme
Les résultats (sur un vieux PII 400) se passent de commentaire :
Programme en C++ :
C :
Perl :
La compilation s'est faite sous linux avec GCC et G++ 3.2 (option "-s -Os" ). Voila le code source (d'accord, ce programme est inutile et merdique, mais ça doit être suffisant pour faire un petit test, non ?) :
cpp :
C :
Perl :
Je demande l'indulgence, je débute en C++.
Qu'en pensez-vous ? C'est normal une telle différence ? Est-ce mon code qui est en cause ? Mon cerveau ? Ou le C++ ?
Message édité par kalex le 26-04-2003 à 05:31:21