为什么QueuePerformanceCounter表现奇怪?

时间:2015-02-18 13:07:51

标签: c# time performancecounter

开胃菜的好伙伴们,

我正在尝试在C#中创建一个Timing类,它可以输出执行特定行代码所需的时间。这是我到目前为止开发的类(它使用QueryPerformanceCounter):

class Timing
{
    private long start;
    private long stop;
    private long frequency;
    Decimal multiplier = new Decimal(1.0e9);

    // Importing important DLL's that will be used
    [DllImport("KERNEL32")]
    private static extern bool QueryPerformanceCounter(out long lpPerformanceCount);

    [DllImport("Kernel32.dll")]
    private static extern bool QueryPerformanceFrequency(out long lpFrequency);

    // Timing constructor
    public Timing()
    {
        if (QueryPerformanceFrequency(out frequency) == false)
        {
            // Frequency not supported
            throw new Win32Exception();
        }
    }

    // Method for starting the counter
    public void Start()
    {
        QueryPerformanceCounter(out start);
    }

    // Method for stopping the counter
    public void Stop()
    {
        QueryPerformanceCounter(out stop);
    }

    // Returns the average time between iterations in nanoseconds
    public double Duration(int iterations)
    {
        return ((((double)(stop - start) * (double)multiplier) / (double)frequency) / iterations);
    }

    // Get the elapsed time between the start and the stop function in nanoseconds
    public double getElapsedTime()
    {
        return (((double)(stop - start) * (double)multiplier) / (double)frequency);
    }
}

我想执行一项测试,看看我的Timing类是否会在连续五次执行相同代码行时打印相同的时间:

static void Main(string[] args)
{
        runCollectionTest(1000);
        runCollectionTest(1000);
        runCollectionTest(1000);
        runCollectionTest(1000);
        runCollectionTest(1000);

        while (true) ;
}

public static void runCollectionTest(int iterations)
{
        Timing timer = new Timing();
        timer.Start();

        ArrayList list = new ArrayList();
        for (int i = 0; i < iterations; i++)
        {
            list.Add(i);
        }

        timer.Stop();
        Console.WriteLine("Time elapsed: " + timer.getElapsedTime() / 1000000 + " milliseconds");
}

以下是代码的输出:

Time elapsed: 0,24631157341192 milliseconds
Time elapsed: 0,0486376114202896 milliseconds
Time elapsed: 0,0620241099763327 milliseconds
Time elapsed: 0,0589005936465893 milliseconds
Time elapsed: 0,088350890469884 milliseconds

我不知道第一次过去和第二次与其他结果相比有多大差异。

0 个答案:

没有答案