Étant donné une interfaceauto-profilage à l'aide classe Proxy
public interface IValueProvider
{
object GetValue(int index);
}
et une structure arborescente des instances de IValueProvider semblables à un arbre d'expression mathématique. Je souhaite mesurer le temps passé dans la méthode GetValue de chaque noeud à l'exécution sans profileur externe. GetValue pourrait faire tout ce que je ne sais pas au moment du design: Collecter des valeurs d'autres IValueProviders, en exécutant une expression IronPython ou même être un plugin externe. Je veux présenter des statistiques sur les horaires des nœuds à l'utilisateur.
Pour cela je peux créer une classe proxy qui encapsule un IValueProvider:
public class ValueProviderProfiler : IValueProvider
{
private IValueProvider valueProvider;
public object GetValue(int index)
{
// ... start measuring
try
{
return this.valuepProvider.GetValue(index);
}
finally
{
// ... stop measuring
}
}
}
Quelle est la meilleure façon de mesurer le temps qui est passer dans un noeud sans distorsions causées par des processus externes, avec une bonne précision et par rapport au fait que les nœuds sont évalués en parallèle? Le simple fait d'utiliser la classe Stopwatch ne fonctionnera pas et le fait de regarder l'heure du processeur ne tient pas compte du fait que le temps CPU aurait pu être consommé sur un autre nœud.
Je m'attends à ce que le temps de réponse de GetValue soit typiquement de l'ordre de la nanoseconde. – Rauhotz
La résolution ne prétend pas être de 10 000 000 ticks par seconde. La définition de tick est 1/10.000.000 de seconde, mais (selon MSDN) la résolution dépend de la minuterie du système - 55 millisecondes pour Windows 98, 10 millisecondes pour Windows NT (3.5 et versions ultérieures). – configurator
Tout cela ne semble pas aider car il a été déclaré que l'exécution est parallèle, non? – mafu