/* On veut trouver la façon la plus rapide pour remplacer une série de comparaison de chaines comme on build-protocol génére On voit qu'en utilisant map, on obtient environ 8 fois la performance. Avec unordered_map, on obtient 13 fois. Ce test a été fait pour le pire cas, soit le dernier de la liste. Pour celui du milieu, c'est 7 fois plus rapide avec le ordered_map. Pour le premier, la performance des maps est à peut près la même, mais évidemment, le cas référence devient extrêmement rapide (100 fois plus rapide). Une solution simple pour optimiser serait de placer les functions les plus populaires au début du fichier. Cela serait assez facile à trouver avec l'instrumentation (même si c'est assez évident) */ #include #include #include #include #include #include #include using namespace std; int main (int argc, char *argv[]) { glocal int ret = -1; glocal const char *gen = nullptr; glocal.ret = (argc,argv); setproginfo ("","0.0","..."); setarg (' ',"gen","Genere les fonctions de tests à partir d'un fichier proto",glocal.gen,false); if (glocal.gen != nullptr){ glocal vector words; (glocal.gen,false); if (line[0] != '\0' && line[0] != '#' && line[0] != '&'){ vector tb; if (str_splitline(line,' ',tb)>0){ glocal.words.push_back(tb[0]); } } return 0; // Reference { printf ("unsigned test_ref(const char *func, unsigned nbrep)\n"); printf ("{\n"); printf ("\tunsigned count = 0;\n"); printf ("\tfor (unsigned i=0; i mp;\n",s); printf ("\tstatic bool is_init=false;\n"); printf ("\tif(!is_init){\n"); printf ("\t\tis_init = true;\n"); for (auto const &w:glocal.words){ printf ("\t\tmp[\"%s\"] = enumfunc::func_%s;\n",w.c_str(),w.c_str()); } printf ("\t}\n"); printf ("\tunsigned count = 0;\n"); printf ("\tfor (unsigned i=0; isecond){\n"); unsigned pos = 1; for (auto const &w:glocal.words){ printf ("\t\t\tcase enumfunc::func_%s:\n",w.c_str()); printf ("\t\t\t\tcount += %u;\n",pos); printf ("\t\t\t\tbreak;\n"); pos++; } printf ("\t\t\t}\n"); printf ("\t\t}\n"); printf ("\t}\n"); printf ("\treturn count;\n"); printf ("}\n"); } } } return 0; return glocal.ret; }