api级高精度计时

C++:

#include <iostream>
#include <windows.h>

using namespace std;

int main(int argc, char* argv[])
{
    LARGE_INTEGER frequency, start, end;

    double timeElapsedTotal;

    if(!QueryPerformanceFrequency( &frequency ))
    {
        cout<<"not supported"<<endl;
        return 0;
    }

    if(!QueryPerformanceCounter(&start))
    {
        cout<<"query start failed"<<endl;
        return 0;
    }

    // 要计时代码开始
    int x;
    for (int i = 0; i < 1000000000; i++)
    {
        x = 1 + 1;
    }
    // 要计时代码结束


    if(!QueryPerformanceCounter(&end))
    {
        cout<<"query end failed"<<endl;
        return 0;
    }

    timeElapsedTotal = (double)(end.QuadPart - start.QuadPart)/(double)frequency.QuadPart;
    cout<<fixed<<showpoint<<"frequency"<<frequency.QuadPart<<", total   time: "<<timeElapsedTotal<<endl;
}

 

C#:

using System;
using System.Runtime.InteropServices;
using System.Threading;

namespace timer
{
    public class Program
    {
        [DllImport("kernel32.dll")]
        private static extern bool QueryPerformanceFrequency(ref   Int64 lpFrequency);

        [DllImport("kernel32.dll")]
        private static extern bool QueryPerformanceCounter(ref   Int64 lpPerformanceCount);

        public static void Main(string[] args)
        {
            long frequency = 0;
            long start = 0;
            long end = 0;

            if (!QueryPerformanceFrequency(ref   frequency))
            {
                Console.WriteLine("not   supported.");
                return;
            }

            if (!QueryPerformanceCounter(ref   start))
            {
                Console.WriteLine("query   start   failed.");
                return;
            }

            // 计时代码开始
            int x;

            for (int i = 0; i < 1000000000; i++)
            {
                x = 1 + 1;
            }
            // 计时代码结束

            if (!QueryPerformanceCounter(ref   end))
            {
                Console.WriteLine("query   end   failed.");
                return;
            }
            Console.WriteLine("frequency   =   {0},   total   time   {1}",
                frequency, (double)(end - start) / ((double)frequency));

        }
    }
}

通过这两个程序,我发现C#的要快一些,感觉很纳闷,不是说C#要比C++慢很多么?后来自己想了一下,觉得是这中计时只是把运行时间计算进去,并没有计算即时编译时间。因为C#做了优化,所以使其程序的运行时间比C++快很多。但是如果把编译时间算进去的话,C#肯定要慢,因为C++不需要即时编译,直接运行就可以了。

posted on 2009-01-03 11:50  小橋流水  阅读(567)  评论(1编辑  收藏  举报

导航