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,提问作者مهدی
相关产品推荐
相关产品推荐

