2016-12-29 1 views
1

J'ai essayé BenchmarkDotNet avec une classe de test simplepremière fois appel à BenchmarkDotNet

public class BenchTest 
{ 
    bool First = false; 

    [Benchmark] 
    public void FirstTimeInitEffect() 
    { 
     if (First == false) 
     { 
      Console.WriteLine("First called"); 
      First = true; 
      Thread.Sleep(1000); 
     } 
     else 
     { 
      Thread.Sleep(10); 
     } 

    } 
} 

et le laisser courir avec

static void Main(string[] args) 
    { 
     var cfg = ManualConfig.Create(DefaultConfig.Instance); 
     var job = new Job(); 
     job.Accuracy.RemoveOutliers = false; 
     cfg.Add(new Job[] { 
      job 
      } 
     ); 

     BenchmarkRunner.Run<BenchTest>(cfg); 
    } 

Ce imprime un bon résumé mais ce que je suis absent des résultats est que le premier appel à la méthode FirstTimeInitEffect prend 1s. Je m'attendrais d'un outil de référence pour me montrer les effets d'appel d'abord aussi bien. J'ai essayé une config personnalisée pour empêcher l'élimination des valeurs aberrantes mais cela n'a pas fait l'affaire. Suis-je en utilisant l'outil faux ou est-ce en dehors de la portée de l'outil?

// * Detailed results * 
BenchTest.FirstTimeInitEffect: Job-LQPFTL(RemoveOutliers=False) 
Runtime = Clr 4.0.30319.42000, 32bit LegacyJIT-v4.6.1586.0; GC = Concurrent Workstation 
Mean = 10.8548 ms, StdErr = 0.0169 ms (0.16%); N = 15, StdDev = 0.0654 ms 
Min = 10.7158 ms, Q1 = 10.8058 ms, Median = 10.8963 ms, Q3 = 10.9011 ms, Max = 10.9029 ms 
IQR = 0.0953 ms, LowerFence = 10.6628 ms, UpperFence = 11.0440 ms 
ConfidenceInterval = [10.8217 ms; 10.8879 ms] (CI 95%) 
Skewness = -1.01049139924314, Kurtosis = 2.40561202562778 


Total time: 00:00:21 (21.92 sec) 

// * Summary * 

BenchmarkDotNet=v0.10.1, OS=Microsoft Windows NT 6.2.9200.0 
Processor=Intel(R) Core(TM) i7-4770K CPU 3.50GHz, ProcessorCount=8 
Frequency=3417979 Hz, Resolution=292.5706 ns, Timer=TSC 
    [Host]  : Clr 4.0.30319.42000, 32bit LegacyJIT-v4.6.1586.0 
    Job-LQPFTL : Clr 4.0.30319.42000, 32bit LegacyJIT-v4.6.1586.0 

RemoveOutliers=False Allocated=0 B 

       Method |  Mean | StdDev | 
-------------------- |----------- |---------- | 
FirstTimeInitEffect | 10.8548 ms | 0.0654 ms | 

Répondre

4

BenchmarkDotNet effectue beaucoup d'itérations de démarrage; cela permet d'atteindre un état stable avant de commencer à collecter des mesures réelles. En outre, il fait quelques trucs supplémentaires qui invoquent aussi votre méthode (jitting, itérations pilote, et ainsi de suite). Ainsi, le premier appel a été omis et n'a pas été inclus dans le résumé.

Si vous voulez obtenir des statistiques basées sur toutes les mesures (sans jitting, pilote et itérations de réchauffement), vous devez utiliser RunStrategy.ColdStart (au lieu de RunStrategy.Throughput qui est la valeur par défaut). Cela fonctionne bien depuis BenchmarkDotNet v0.10.2.

code source:

[SimpleJob(RunStrategy.ColdStart, targetCount: 5)] 
[MinColumn, MaxColumn, MeanColumn, MedianColumn] 
public class BenchTest 
{ 
    private bool firstCall; 

    [Benchmark] 
    public void FirstTimeInitEffect() 
    { 
     if (firstCall == false) 
     { 
      firstCall = true; 
      Console.WriteLine("// First call"); 
      Thread.Sleep(1000); 
     } 
     else 
      Thread.Sleep(10); 
    } 
} 

Mesures:

Result 1: 1 op, 1000582715.59 ns, 1.0006 s/op 
Result 2: 1 op, 10190609.23 ns, 10.1906 ms/op 
Result 3: 1 op, 10164930.24 ns, 10.1649 ms/op 
Result 4: 1 op, 10604238.53 ns, 10.6042 ms/op 
Result 5: 1 op, 10420930.04 ns, 10.4209 ms/op 

Résultats détaillés:

Mean = 208.4175 ms, StdErr = 198.1331 ms (95.07%); N = 5, StdDev = 443.0390 ms 
Min = 10.1163 ms, Q1 = 10.1203 ms, Median = 10.4233 ms, Q3 = 505.7118 ms, Max = 1,000.9497 ms 
IQR = 495.5915 ms, LowerFence = -733.2670 ms, UpperFence = 1,249.0991 ms 
ConfidenceInterval = [-179.9233 ms; 596.7583 ms] (CI 95%) 
Skewness = 1.07, Kurtosis = 2.08 

Résumé:

BenchmarkDotNet=v0.10.1, OS=Microsoft Windows NT 6.2.9200.0 
Processor=Intel(R) Core(TM) i7-6700HQ CPU 2.60GHz, ProcessorCount=8 
Frequency=2531252 Hz, Resolution=395.0614 ns, Timer=TSC 
    [Host]  : Clr 4.0.30319.42000, 32bit LegacyJIT-v4.6.1586.0 
    Job-IQRRGS : Clr 4.0.30319.42000, 32bit LegacyJIT-v4.6.1586.0 

RunStrategy=ColdStart TargetCount=5 Allocated=1.64 kB 

       Method |  Mean |  StdErr |  StdDev |  Min |   Max |  Median | 
-------------------- |------------ |------------ |------------ |----------- |-------------- |----------- | 
FirstTimeInitEffect | 208.4175 ms | 198.1331 ms | 443.0390 ms | 10.1163 ms | 1,000.9497 ms | 10.4233 ms |