Incompréhension du temps d'execution
Hello,
Je reprend un ancien projet : création d'une image (chargement d'une font et bin paking pour en faire un atlas), puis création d'un SDF à partir de cet atlas.
Mon but est de réduire le temps d'exec, plus par curiosité que par nécessité.
Et là je me retrouve face à un truc bizarre : afficher l'image générée multiplie par 3 son temps de création :aie:.
Mon code ressemble à ça:
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
| template <class Function>
void timeIt(Function function, std::string const& desc) {
auto startTime = std::chrono::high_resolution_clock::now();
function();
auto endTime = std::chrono::high_resolution_clock::now();
auto t = std::chrono::duration_cast<std::chrono::duration<double>>(endTime - startTime);
std::cout << desc << t.count() << " seconds." << std::endl;
}
int main(int, char**) {
sf::Image atlas;
timeIt([&]() {
pack(atlas, "sansation_bold.ttf", 600, 32, 4096);
}, "Atlas generated in ");
atlas.saveToFile("atlas.png");
sf::Image resultImage;
timeIt([&]() {
generateSDFFrom4ChannelsMT(resultImage,
"atlas.png",
"atlas.png",
"atlas.png",
"atlas.png",
256, 256,
centeredLinearDistance(128.)); },
"SDF generated in ");
resultImage.saveToFile("atlas_4.png");
return 0;
} |
Qui me donne
Code:
1 2
| Atlas generated in 0.813719 seconds.
SDF generated in 2.43448 seconds. |
(Même temps d'exec en autorisant le compilo à générer du code SSE2 ou AVX).
Maintenant en changeant le code pour devenir
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
| template <class Function>
void timeIt(Function function, std::string const& desc) {
auto startTime = std::chrono::high_resolution_clock::now();
function();
auto endTime = std::chrono::high_resolution_clock::now();
auto t = std::chrono::duration_cast<std::chrono::duration<double>>(endTime - startTime);
std::cout << desc << t.count() << " seconds." << std::endl;
}
int main(int, char**) {
sf::Image atlas;
timeIt([&]() {
pack(atlas, "sansation_bold.ttf", 600, 32, 4096);
}, "Atlas generated in ");
atlas.saveToFile("atlas.png");
sf::Image resultImage;
timeIt([&]() {
generateSDFFrom4ChannelsMT(resultImage,
"atlas.png",
"atlas.png",
"atlas.png",
"atlas.png",
256, 256,
centeredLinearDistance(128.)); },
"SDF generated in ");
resultImage.saveToFile("atlas_4.png");
// boucle d'affichage
return 0;
} |
Le temps d'exec reste le même avec du code SSE2 (logique), mais est triplé avec du code AVX (atlas : 0.8sec / SDF : 7.3sec).
Comment est-ce possible que la boucle d'affichage impacte le temps de création du SDF ? :aie: