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

Npgsql中Activity.Duration远低于实际耗时的原因是什么?

关于Npgsql的Duration计算与Stopwatch耗时差异问题

我搞不懂Npgsql是怎么计算Duration的,用Stopwatch捕获的耗时比它高一个数量级,原本以为这两个测量结果应该接近得多。

在我的机器上得到如下时间:

Activity.Duration:   00:00:00.0174913
Stopwatch duration:  00:00:00.1394318

复现步骤

1. 创建.NET控制台应用代码

using System.Diagnostics;
using Npgsql;
using OpenTelemetry;
using OpenTelemetry.Resources;
using OpenTelemetry.Trace;

using var tracerProvider = Sdk.CreateTracerProviderBuilder()
    .SetResourceBuilder(ResourceBuilder.CreateDefault().AddService("npgsql-tester"))
    .SetSampler(new AlwaysOnSampler())
    .AddSource("MyApp")
    .AddNpgsql()
    .AddConsoleExporter()
    .Build();

var connectionString = "Host=localhost;Database=db;Username=dbuser;Password=dbpassword;";
await using var dataSource = NpgsqlDataSource.Create(connectionString);
await using var cmd = dataSource.CreateCommand("SELECT 1");

var timer = new Stopwatch();
timer.Start();

await cmd.ExecuteScalarAsync();

timer.Stop();
Console.WriteLine($"Stopwatch duration: {timer.Elapsed}");

2. 添加依赖包

dotnet add package Npgsql -v 7.0.2
dotnet add package Npgsql.OpenTelemetry -v 7.0.2
dotnet add package OpenTelemetry.Exporter.Console -v 1.4.0
dotnet add package OpenTelemetry.Instrumentation.SqlClient -v 1.0.0-rc9.13

3. 启动本地Postgres实例(Docker)

docker run --name npgsql-duration -p 5432:5432 -e POSTGRES_DB=db -e POSTGRES_USER=dbuser -e POSTGRES_PASSWORD=dbpassword -d postgres

内容的提问来源于stack exchange,提问作者Couper

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 03:23:24