You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ASP.NET Core如何获取微秒级(小于1毫秒)的Ping延迟?

在ASP.NET Core中获取微秒级网络延迟的方法

问题描述

我希望在ASP.NET Core中测量内部网络的延迟,但由于延迟处于0到1毫秒之间(例如0.263毫秒),当前使用Ping类返回的结果为0。请问是否有方法在ASP.NET Core中获取微秒级的延迟?

当前使用的代码如下:

public void OnGet()
{
    Ping pingSender = new Ping();
    PingReply reply = pingSender.Send("localhost");

    if (reply.Status == IPStatus.Success)
    {
        TempData["RoundTrip time"]= "RoundTrip time: " + reply.RoundtripTime;
    }
}

我想到了一个能运行但编码风格糟糕的不规范方法,不想采用:

public void OnGet()
{
    DateTime t1;
    DateTime t2;

    Ping pingSender = new Ping();

    t1 = DateTime.Now;
    PingReply reply = pingSender.Send("localhost");            
    t2 = DateTime.Now;

    long b = (long)t2.Subtract(t1).TotalMilliseconds;
    long b2 = (long)t2.Subtract(t1).TotalMicroseconds;
    long b3 = (long)t2.Subtract(t1).TotalNanoseconds;

    TempData["t"] = b;
    TempData["t2"] = b2;
    TempData["t3"] = b3;
}

可行解决方案

1. 用Stopwatch替代DateTime实现高精度计时

DateTime.Now的系统时钟精度不足以支撑微秒级测量,推荐使用System.Diagnostics.Stopwatch——它基于硬件计时器,精度可达微秒甚至纳秒级别,完全满足你的需求。

示例代码:

public void OnGet()
{
    var pingSender = new Ping();
    var stopwatch = Stopwatch.StartNew();
    
    PingReply reply = pingSender.Send("localhost");
    stopwatch.Stop();

    if (reply.Status == IPStatus.Success)
    {
        // 计算微秒级耗时
        long microseconds = stopwatch.ElapsedTicks * 1000000 / Stopwatch.Frequency;
        TempData["RoundTrip time"] = $"RoundTrip time: {microseconds} 微秒";
        
        // 也可以直接获取带小数的毫秒值,保留三位小数展示
        double preciseMilliseconds = stopwatch.Elapsed.TotalMilliseconds;
        TempData["Precise RoundTrip time"] = $"Precise RoundTrip time: {preciseMilliseconds:F3} 毫秒";
    }
}

2. 优化测量精度:多次测量取平均值

单次测量可能受系统线程调度等因素影响产生误差,建议多次测试后取平均值,结果更可靠:

public void OnGet()
{
    var pingSender = new Ping();
    const int testCount = 10;
    long totalMicroseconds = 0;
    int successCount = 0;

    for (int i = 0; i < testCount; i++)
    {
        var stopwatch = Stopwatch.StartNew();
        PingReply reply = pingSender.Send("localhost");
        stopwatch.Stop();

        if (reply.Status == IPStatus.Success)
        {
            totalMicroseconds += stopwatch.ElapsedTicks * 1000000 / Stopwatch.Frequency;
            successCount++;
        }
    }

    if (successCount > 0)
    {
        long averageMicroseconds = totalMicroseconds / successCount;
        TempData["Average RoundTrip time"] = $"Average RoundTrip time: {averageMicroseconds} 微秒";
    }
}

3. 关于Ping类的精度说明

PingReply.RoundtripTime本身只返回整数毫秒值,天生无法提供微秒级精度,所以必须借助外部高精度计时器来获取准确的耗时数据。

内容的提问来源于stack exchange,提问作者مهدی

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 18:13:23