Exemple - PowerPoint PPT Presentation

1 / 21
About This Presentation
Title:

Exemple

Description:

isspam : teste mesg pour l'occurrence d'un motif */ int isspam(char ... (mesg, pat[i]) != NULL) { printf( spam : correspondance pour %s'n'', pat[i]); return 1; ... – PowerPoint PPT presentation

Number of Views:24
Avg rating:3.0/5.0
Slides: 22
Provided by: pab1104
Category:

less

Transcript and Presenter's Notes

Title: Exemple


1
Exemple
  • Développement dun filtre de spam (avec des
    exemples de B. Kernighan et R. Pike  La
    programmation en pratique )
  • Vladimir Makarenkov
  • (Université du Québec à Montréal)

2
Première version de isspam
  • / isspam teste mesg pour loccurrence dun
    motif /
  • int isspam(char mesg)
  • int i
  • for (i 0 i lt npat i)
  • if (strstr(mesg, pati) ! NULL)
  • printf(spam correspondance pour s\n,
    pati)
  • return 1
  • return 0

3
Implémentation de base de strstr
  • / strstr simple employer strchr pour vérifier
    le premier caractère /
  • char strstr(const char s1, const char s2)
  • int n
  • n strlen(s2)
  • for ( )
  • s1 strchr(s1, s20)
  • if (s1 NULL)
  • return NULL
  • if (strncmp(s1, s2, n) 0)
  • return (char ) s1
  • s1

4
Recherche dune boucle efficace
for (i 0 i lt npat i) if (strstr(mesg,
pati) ! NULL) return 1
for (j 0 mesgj ! \0 j) if (un motif
correspond au début du mesgj) return 1
5
Nouvelle version de isspam
  • int patlenNPAT / longueur du motif /
  • int startingUCHAR_MAX1NSTART / les motifs
    classés par caractères initiaux /
  • int nstartingUCHAR_MAX1 / nombre de motifs
    de ce type /
  • / isspam teste mesg pour loccurrence dun
    motif /
  • int isspam(char mesg)
  • int i, j, k
  • unsigned char c
  • for (j 0 (c mesgj) ! \0 j)
  • for (i 0 i lt nstartingc i)
  • k startingci
  • if (memcmp(mesgj, patk, patlenk) 0)
  • printf(spam correspondance pour
    s\n, patk)
  • return 1
  • return 0

6
Structure de données
7
Code de construction des tables
  • int i
  • unsigned char c
  • for (i 0 i lt npat i)
  • c pati0
  • if (nstartingc gt NSTART)
  • eprintf(trop de motifs (gtd) commençant par
    c ,
  • NSTART, c)
  • startingcnstartingc i
  • patleni strlen(pati)

8
Évaluation du temps
  • include lttime.hgt
  • include ltstdio.hgt
  • clock_t avant
  • double durée
  • avant clock()
  • fonction_lente()
  • duree clock() avant
  • printf(La fonction a utilisé .3f
    secondes\n, duree/CLOCKS_PER_SEC)

9
Évaluation du temps (2)
  • include lttime.hgt
  • include ltstdio.hgt
  • clock_t avant
  • double durée
  • avant clock()
  • for (i 0 i lt 1000 i)
  • fonction_rapide()
  • duree (clock() avant) / (double) i
  • printf(La fonction a utilisé .9f
    secondes\n, duree/CLOCKS_PER_SEC)

10
Profil de la première version de isspam
secs cum cycles instructions appels fonction
45.260 81.0 81.0 11314990000 9440110000 48350000 strchr
6.081 10.9 91.9 1520280000 1566460000 46180000 strncmp
2.592 4.6 96.6 648080000 854500000 2170000 strstr
1.825 3.3 99.8 456225559 344882213 2170435 strlen
0.088 0.2 100.0 21950000 28510000 10000 isspam
0.000 0.0 100.0 100025 100028 1 main
0.000 0.0 100.0 53677 70268 219 _memccpy
0.000 0.0 100.0 48888 46403 217 strcpy

11
Profil de la version finale de isspam
secs cum cycles instructions appels fonction
3.524 56.9 56.9 880890000 1027590000 46180000 memcmp
2.662 43.0 100.0 665550000 902920000 10000 isspam
0.001 0.0 100.0 140304 106043 652 strlen
0.000 0.0 100.0 100025 100028 1 main

12
Mise au point du code
  • Rassembler les sous-expressions communes
  • sqrt(dxdx dydy) ((sqrt(dxdx dydy) gt
    0) ? )
  • vs
  • maDistance sqrt(dxdx dydy)
  • maDistance ((maDistance gt 0) ? )
  • for (i 0 i lt nstartingc i)
  • vs
  • n nstartingc
  • for (i 0 i lt n i)

13
Mise au point du code (2)
  • Dérouler ou éliminer les boucles
  • for (i 0 i lt 3 i)
  • ai bi ci
  • vs
  • a0 b0 c0
  • a1 b1 c1
  • a2 b2 c2
  • for (i 0 i lt 3n i)
  • ai bi ci
  • vs
  • for (i 0 i lt 3n i3)
  • ai0 bi0 ci0
  • ai1 bi1 ci1
  • ai2 bi2 ci2

14
Mise au point du code (3)
  • Placer en mémoire cache les valeurs fréquemment
    utilisées
  • if (c ! lastc) / met à jour le cache /
  • lastc c
  • lastcode lookup(c)
  • show(lastcode)

15
Estimation de coûts dopérations
Opération Int Float Double
i i j (pour float et double) 8 8 8
i a b 12 12 12
i a b 12 12 12
i a b 12 11 11
i a / b 114 28 58
i a b (pour int) 114 N.A. N.A.
16
Estimation de coûts dopérations (2)
Autres opérations Autres opérations
Conversion float en int 8
Conversion int en float 8
Sur des vecteurs entiers Sur des vecteurs entiers
vi i 49
vvi i 81
vvvi i 100
17
Estimation de coûts dopérations (3)
Structures de contrôle Structures de contrôle
if (i 5) a 4
if (i ! 5) a 12
while (i lt 0) a 3
a sum1(b) 57
a sum2(b, c) 58
a sum3(b, c, d) 54
18
Estimation de coûts dopérations (4)
Entrée / Sortie Entrée / Sortie
fputs(s, fp) 270
fgets(s, 9, fp) 222
fprintf(fp, d\n, i) 1820
fscanf(fp, d\n, i) 2070
Malloc Malloc
free(malloc(8)) 342
19
Estimation de coûts dopérations (5)
Fonctions de chaînes de caractères Fonctions de chaînes de caractères
strcpy(s, 0123456789) 157
i strcmp(s, s) 176
i strcmp(s, a123456789) 64
20
Estimation de coûts dopérations (6)
Conversions chaînes / nombres Conversions chaînes / nombres
i atoi(12345) 402
sscanf(12345, d, i) 2376
sprintf(s, d, i) 1492
f atof(123.45) 4098
sscanf(123.45, f, f) 6438
sprintf(s, 6.2f, 123.45) 3902
21
Estimation de coûts dopérations (7)
Fonctions mathématiques Fonctions mathématiques
i rand() 135
f log(f1) 418
f exp(f1) 462
f sin(f1) 514
f sqrt(f1) 112
Write a Comment
User Comments (0)
About PowerShow.com