progc
Différences
Ci-dessous, les différences entre deux révisions de la page.
Les deux révisions précédentesRévision précédenteProchaine révision | Révision précédente | ||
progc [2018/05/15 13:07] – brbachel | progc [2018/10/11 20:49] (Version actuelle) – modification externe 127.0.0.1 | ||
---|---|---|---|
Ligne 3: | Ligne 3: | ||
===== Eléments de programmation multithread ===== | ===== Eléments de programmation multithread ===== | ||
- | Depuis le C++11, manipuler des threads en C++ est devenu plus simple et totalement portable. Voici un diaporama qui présente brièvement des fonctionnalités qui permettent de lancer des tâches sur des threads et les synchroniser: | + | Depuis le C++11, manipuler des threads en C++ est devenu plus simple et totalement portable. Voici un diaporama qui présente brièvement des fonctionnalités |
+ | |||
+ | Par programmation, | ||
===== Mesure des temps de calcul ===== | ===== Mesure des temps de calcul ===== | ||
+ | |||
+ | Pour mesurer les temps de calcul d'un programme, une bonne solution consiste à utiliser la commande Unix '' | ||
+ | |||
+ | ==== La solution: getrusage ==== | ||
+ | Une bonne solution pour mesurer un temps de calcul par programmation consiste donc à utiliser la fonction '' | ||
+ | |||
+ | <code c++> | ||
+ | #include " | ||
+ | |||
+ | long fibonacci(unsigned n) { | ||
+ | if (n<2) return n; | ||
+ | | ||
+ | } | ||
+ | |||
+ | int main(void) { | ||
+ | auto start = now(); | ||
+ | | ||
+ | auto end = now(); | ||
+ | |||
+ | auto duration = end-start; | ||
+ | |||
+ | | ||
+ | | ||
+ | | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | La fonction '' | ||
+ | |||
+ | < | ||
+ | real 16080 ms | ||
+ | user 16088 ms | ||
+ | sys 0 ms | ||
+ | </ | ||
+ | |||
+ | Si on lance la commande '' | ||
+ | |||
+ | < | ||
+ | real 0m16.097s | ||
+ | user 0m16.089s | ||
+ | sys | ||
+ | </ | ||
+ | |||
+ | ==== Temps d' | ||
+ | |||
+ | La fonction '' | ||
+ | |||
+ | <code c++> | ||
+ | #include < | ||
+ | #include < | ||
+ | |||
+ | #include " | ||
+ | |||
+ | std::mutex mutex; | ||
+ | |||
+ | long fibonacci(unsigned n) { | ||
+ | if (n<2) return n; | ||
+ | | ||
+ | } | ||
+ | |||
+ | void measure(unsigned n) { | ||
+ | auto start = now(RUSAGE_THREAD); | ||
+ | | ||
+ | auto end = now(RUSAGE_THREAD); | ||
+ | |||
+ | auto duration = end-start; | ||
+ | |||
+ | | ||
+ | | ||
+ | | ||
+ | } | ||
+ | |||
+ | int main(void) { | ||
+ | | ||
+ | |||
+ | auto start = now(); | ||
+ | for (unsigned i = 0; i<4; ++i) t[i] = std:: | ||
+ | for (unsigned i = 0; i<4; ++i) t[i].join(); | ||
+ | auto end = now(); | ||
+ | |||
+ | auto duration = end-start; | ||
+ | |||
+ | | ||
+ | | ||
+ | | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | Et voici les mesures que l'on peut obtenir, où l'on constate que le temps cumulé des threads correspond bien au temps mesuré pour le processus: | ||
+ | |||
+ | < | ||
+ | [thread #2] | ||
+ | real = 70480 ms | ||
+ | user = 17622 ms | ||
+ | sys = 0 ms | ||
+ | [thread #1] | ||
+ | real = 70500 ms | ||
+ | user = 17627 ms | ||
+ | sys = 0 ms | ||
+ | [thread #3] | ||
+ | real = 70520 ms | ||
+ | user = 17638 ms | ||
+ | sys = 0 ms | ||
+ | [thread #4] | ||
+ | real = 70520 ms | ||
+ | user = 17637 ms | ||
+ | sys = 2 ms | ||
+ | [overall] | ||
+ | real = 70520 ms | ||
+ | user = 70525 ms | ||
+ | sys = 4 ms | ||
+ | </ | ||
+ |
progc.1526389621.txt.gz · Dernière modification : 2018/10/11 20:49 (modification externe)