2012-03-17 2 views
0

J'utilise C sur linux, et mon programme est à la fois de haute densité CPU et une densité d'E/S. En utilisant des spectacles de commande de temps que mon programme ayant de frais généraux:Comment réduire les frais généraux de mon programme C?

real 1m4.639s 
user 0m53.929s 
sys   0m9.747s 

Est-ce possible de trouver des sys 0m9.747s 'quels sont les coûts et réduire?

============================================== Excuse moi si cette question n'est pas facile à répondre sans le code, mais mon code est trop long pour être posté ici. Donc, des conseils ou des indices feront également. Merci

+0

poster le code. > _ < – Oleksi

+0

c'est trop long pour poster. En fait, je fais une simple indexation inversée –

+2

Si vous éliminez * tout * l'heure du système, vous avez seulement accéléré votre programme de 16%. Vous obtiendrez probablement plus pour votre argent en se concentrant sur les 53 secondes de temps de l'utilisateur; Si vous faites une réduction de 20% dans ce temps, vous avez surpassé ce que vous obtiendriez par l'impossible réduction de 100% du temps système. –

Répondre

7

Le temps CPU du système est le temps passé dans le noyau pour votre processus, en effectuant des appels système. Vous pouvez utiliser strace pour savoir quels appels système votre processus est en train de faire.

Peut-être avez-vous beaucoup de petits appels système read (ou write). Vous pouvez réduire leur nombre en augmentant la taille de vos tampons (donc chaque read et write transmettra plus d'octets). Voir this et that réponses aux questions pertinentes.

Vous pouvez également utiliser mmap pour projeter des fichiers dans la mémoire (virtuelle); cela pourrait être un meilleur moyen pour une sorte d'E/S de disque.

Mais je ne vais pas me concentrer spécifiquement sur l'heure du système. Il semble ne manger que 15% du temps CPU, ce qui est un ratio raisonnable.

Je suggère de profiler votre programme (en utilisant gprof ou oprofile) et de trouver où sont les goulots d'étranglement.

+0

+1: Profil! Jusqu'à ce que vous ayez fait cela, afin de savoir où votre programme passe son temps, vous risquez d'essayer d'optimiser les mauvaises choses. –

+0

oui, il y a beaucoup d'appels en lecture et écriture, je vais faire un test –

3

C'est une question extrêmement ouverte, et il n'y a pas de bonne réponse étant donné la largeur de la question sans plus d'informations. Cela dit, je vous recommande d'utiliser quelque chose comme valgrind pour profiler votre application, déterminer quelles fonctions spécifiques de votre code prennent le plus de temps et travailler à les optimiser.

Avec cela à l'écart, vous devriez vraiment vous concentrer sur le temps passé dans la terre de l'utilisateur. Avec 53 secondes vs 9 secondes de temps système, vous serez probablement en mesure d'optimiser beaucoup plus là-bas. Votre temps d'optimisation serait mieux utilisé là-bas.

Questions connexes