Le cache de l'UC interrompt toujours ce que nous testons une performance de certains codes. Lorsque vous mesurez les performances de votre code, comment pouvez-vous supprimer l'influence du cache.? Je trouve des fonctions ou des façons de le faire sous Windows.
S'il vous plaît donnez-moi vos bons conseils. Merci.Comment vider un cache lorsque nous mesurons la performance de la fonction
Répondre
Un bon code tire avantage du cache, donc vous ne pouvez pas l'éteindre (vous pouvez, mais ces résultats seront complètement hors de propos).
De quoi avez-vous besoin pour vider (ou invalider) le cache entre les tests successifs. Voici quelques conseils: Invalidating the CPU's cache
Une chose que vous pouvez faire est d'appeler une fonction qui a beaucoup de code et accède à beaucoup de mémoire entre les appels à l'élément que vous profilez. Par exemple, dans le code pseudo (comme la plupart du temps un langage neutre):
// loop some number of times
{
//start timing
profile_func();
//stop timing
//add to total time
large_func(); // Uses lots of memory and has lots of code
}
// Compute time of profile func by dividing number of iterations by total time
Le code dans le large_func() peut être un code non-sens, comme un ensemble d'opérations répétées sur et plus. La clé est que ce code, ou son code, n'est pas optimisé lorsque vous compilez, de sorte qu'il efface réellement les caches de code et de données de la CPU (ainsi que les caches L2 et L3 (si présents)).
Ceci est un test très important dans de nombreux cas. La raison pour laquelle il est important est que les petites fonctions rapides qui sont souvent profilées isolément peuvent fonctionner très rapidement, en tirant parti du cache, de l'inlining et de l'enregistrement du CPU. Mais, souvent, dans de grandes applications, ces avantages sont absents, en raison du contexte dans lequel ces fonctions rapides sont appelées. Par exemple, le simple profilage d'une fonction en l'exécutant pour un million d'itérations dans une boucle serrée peut montrer que la fonction s'exécute, disons 50 nanosecondes. Ensuite, vous l'exécutez en utilisant le cadre que j'ai montré ci-dessus, et tout à coup son temps d'exécution peut augmenter considérablement en microsecondes, car il ne peut plus profiter du fait qu'il a tout le processeur - ses registres et caches.
Sans aucune mise en cache, les performances seront souvent abyssales. Je préférerais essayer de mesurer les charges de travail représentatives sur des plates-formes représentatives (c'est-à-dire de mise en cache). –
Voulez-vous vider le cache de temps en temps comme l'indique le sujet? Ou voulez-vous désactiver entièrement le cache comme le dit la question? –
Je veux exécuter les fonctions de manière équitable. C'est tout. Si func1 n'est pas mis en cache, func2 ne doit pas non plus être mis en cache. Si func1 provoque des erreurs de page, func2 aussi. Bien sûr, je veux que les deux ne causent pas de fautes de page. – Benjamin