1 / 21

Exemple

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). Première version de isspam. /* isspam : teste mesg pour l’occurrence d’un motif */ int isspam(char *mesg) {

iolana
Download Presentation

Exemple

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  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. Nouvelle version de isspam 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; }

  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 <time.h> #include <stdio.h> … 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 <time.h> #include <stdio.h> … 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

  11. Profil de la version finale de isspam

  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

  16. Estimation de coûts d’opérations (2)

  17. Estimation de coûts d’opérations (3)

  18. Estimation de coûts d’opérations (4)

  19. Estimation de coûts d’opérations (5)

  20. Estimation de coûts d’opérations (6)

  21. Estimation de coûts d’opérations (7)

More Related