La présentation est en train de télécharger. S'il vous plaît, attendez

La présentation est en train de télécharger. S'il vous plaît, attendez

Exemple Développement d’un filtre de spam (avec des exemples de B. Kernighan et R. Pike « La programmation en pratique ») Vladimir Makarenkov (Université.

Présentations similaires


Présentation au sujet: "Exemple Développement d’un filtre de spam (avec des exemples de B. Kernighan et R. Pike « La programmation en pratique ») Vladimir Makarenkov (Université."— Transcription de la présentation:

1 Exemple Développement d’un 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 l’occurrence d’un motif */ int isspam(char *mesg) { int i; for (i = 0 ; i < npat; i++) if (strstr(mesg, pat[i]) != NULL) { printf(‘‘spam : correspondance pour ‘%s’\n’’, pat[i]); 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, s2[0]); if (s1 == NULL) return NULL; if (strncmp(s1, s2, n) == 0) return (char *) s1; s1++; }

4 Recherche d’une boucle efficace for (i = 0; i < npat; i++) if (strstr(mesg, pat[i]) != NULL) return 1; for (j = 0; mesg[j] != ‘\0’; j++) if ( un motif correspond au début du mesg[j] ) return 1;

5 int patlen[NPAT];/* longueur du motif */ int starting[UCHAR_MAX+1][NSTART];/* les motifs classés par caractères initiaux */ int nstarting[UCHAR_MAX+1];/* nombre de motifs de ce type */ … /* isspam : teste mesg pour l’occurrence d’un motif */ int isspam(char *mesg) { int i, j, k; unsigned char c; for (j = 0; (c = mesg[j]) != ‘\0’; j++) { for (i = 0 ; i < nstarting[c]; i++) { k = starting[c][i]; if (memcmp(mesg+j, pat[k], patlen[k]) == 0) { printf(‘’spam : correspondance pour ‘%s’\n’’, pat[k]); return 1; } return 0; } Nouvelle version de isspam

6 Structure de données

7 Code de construction des tables int i; unsigned char c; for (i = 0; i < npat; i++) { c = pat[i][0]; if (nstarting[c] >= NSTART) eprintf(‘’trop de motifs (>=%d) commençant par ‘%c’ ‘’, NSTART, c); starting[c][nstarting[c]++] = i; patlen[i] = strlen(pat[i]); }

8 Évaluation du temps #include … 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 … clock_t avant; double durée; avant = clock(); for (i = 0; i < 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 %cyclesinstructionsappelsfonction 45.26081.0 11314990000944011000048350000strchr 6.08110.991.91520280000156646000046180000strncmp 2.5924.696.66480800008545000002170000strstr 1.8253.399.84562255593448822132170435strlen 0.0880.2100.0219500002851000010000isspam 0.0000.0100.01000251000281main 0.0000.0100.05367770268219_memccpy 0.0000.0100.04888846403217strcpy …………………

11 Profil de la version finale de isspam secs%cum %cyclesinstructionsappelsfonction 3.52456.9 880890000102759000046180000memcmp 2.66243.0100.066555000090292000010000isspam 0.0010.0100.0140304106043652strlen 0.0000.0100.01000251000281main …………………

12 Mise au point du code Rassembler les sous-expressions communes sqrt(dx*dx + dy*dy) + ((sqrt(dx*dx + dy*dy) > 0) ? …); vs maDistance = sqrt(dx*dx + dy*dy); maDistance + ((maDistance > 0) ? …); for (i = 0; i < nstarting[c]; i++) {…} vs n = nstarting[c]; for (i = 0; i < n; i++) {…}

13 Mise au point du code (2) for (i = 0; i < 3; i++) a[i] = b[i] + c[i]; vs a[0] = b[0] + c[0]; a[1] = b[1] + c[1]; a[2] = b[2] + c[2]; for (i = 0; i < 3*n; i++) a[i] = b[i] + c[i]; vs for (i = 0; i < 3*n; i+=3) { a[i+0] = b[i+0] + c[i+0]; a[i+1] = b[i+1] + c[i+1]; a[i+2] = b[i+2] + c[i+2]; } Dérouler ou éliminer les boucles

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 d’opérations OpérationIntFloatDouble i++ i = j (pour float et double) 888 i = a + b12 i = a – b12 i = a * b1211 i = a / b1142858 i = a % b (pour int)114N.A.

16 Estimation de coûts d’opérations (2) Autres opérations Conversion float en int8 Conversion int en float8 Sur des vecteurs entiers v[i] = i49 v[v[i]] = i81 v[v[v[i]]] = i100

17 Estimation de coûts d’opérations (3) Structures de contrôle if (i == 5) a++4 if (i != 5) a++12 while (i < 0) a++3 a = sum1(b)57 a = sum2(b, c)58 a = sum3(b, c, d)54

18 Estimation de coûts d’opérations (4) 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 free(malloc(8))342

19 Estimation de coûts d’opérations (5) 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 d’opérations (6) 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 d’opérations (7) Fonctions mathématiques i = rand()135 f = log(f1)418 f = exp(f1)462 f = sin(f1)514 f = sqrt(f1)112


Télécharger ppt "Exemple Développement d’un filtre de spam (avec des exemples de B. Kernighan et R. Pike « La programmation en pratique ») Vladimir Makarenkov (Université."

Présentations similaires


Annonces Google