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   小橋流水  阅读(568)  评论(1编辑  收藏  举报

编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· [AI/GPT/综述] AI Agent的设计模式综述

导航

统计

点击右上角即可分享
微信分享提示