User Tools

Site Tools


in204:tds:sujets:td9:part3

This is an old revision of the document!


Partie 3 : Exécution à la compilation

TD9

Références

Question 1 :

Nous nous intéressons à l'estimation du temps de calcul des fonction factorial et des fonctions power_by_int que nous avons défini précédemment.

    auto fn =  estimate_function_time(factorial, 100);
    std::cout << "Computing fact(100)=" << fn .second << " in " << fn.first.count() << " ticks.\n";
    auto pw = estimate_function_time(power_by_int<long double>, 1.0002, 1000000);
    std::cout << "Computing 1.02^1000000=" << pw.second << " in " << pw.first.count() << " ticks.\n";

Ceci nous retourne le temps mis pour calculer la fonction factorial et pour la fonction power_by_int.

Expérimenter.

Question 2 :

Nous souvaitons indiquer au compilateur qu'il peut calculer au moment de la compilation les expressions si celles-ci sont constantes.

Pour ce faire nous ajoutons le mot-clé constexpr devant la fonction ou l'expression dont la valeur peut-être exécuté au moment de la compilation.

Ainsi, nous pouvons indiquer que les deux fonctions factorial et power_by_int peuvent être calculer au moment de la compilation si les arguments sont des valeurs définies au moment de la compilation.

constexpr long double factorial(int n)
{
	return n == 0 ? 1 : n * factorial(n - 1);
}
 
template<class numericalT>
constexpr numericalT power_by_int(numericalT x, int y)
{
	numericalT result = (numericalT)1.0;
	while (y-- > 0)
		result *= x;
	return result;
}

Ceci autorise le compilateur a compilé l'expression au moment de la compilation.

Question 1 :

Tester le code suivant:

auto fn = estimate_function_time(factorial, 100);
std::cout << "Computing fact(100)=" << fn.second << " in " << fn.first.count() << " ticks.\n";
 
auto pw = estimate_function_time(power_by_int<long double>, 1.0002, 1000000);
std::cout << "Computing 1.02^100000=" << pw.second << " in " << pw.first.count() << " ticks.\n";

A votre avis ? Est-ce que le compilateur à générer le code au moment de la compilation ?

Question 2 :

En fait, nous pouvons aider naivement le compilateur en faisant bien apparaître le paramètre constant :

  factorial_100 = []() { return factorial(100); };
  fn = estimate_function_time(factorial_100);
  std::cout << "Computing fact(100)=" << fn.second << " in " << fn.first.count() << " ticks.\n";
 
  power_10002_100000 = []() { return power_by_int<long double>, 1.0002, 100000); };
  pw = estimate_function_time(power_10002_100000);
  std::cout << "Computing 1.02^1000000=" << pw.second << " in " << pw.first.count() << " ticks.\n";

Est-ce que cela améliore les résultats ? Tenter d'expliquer pourquoi ?

</code>

Question 2 :

Tester le code suivant avec un compilateur C++20:

template<double value, int power>
struct constant_value
{
    static constexpr long double constant() { constexpr auto result = power_by_int(value, power); return result; }
};

et appeller cette fonction comme suit:

	auto pw_c = estimate_function_time(pre_computed_value<1.0002, 100000>::pow);
	std::cout << "Computing 1.02^1000000=" << pw_c.second << " in " << pw_c.first.count() << " ticks.\n";

Expliquer ce qui se passe ? Et pourquoi ce résultat.

in204/tds/sujets/td9/part3.1636373537.txt.gz · Last modified: 2021/11/08 12:12 by bmonsuez