为什么使用平均值时图表会出现尖峰?

2023-12-05

我在 WCF 服务中使用 messageInspectors 来测量每个服务方法的运行时间,如下所示:

public void AfterCall(string operationName, object[] outputs, object returnValue, object correlationState)
{
    if (_activated)
    {
        _startTime.Stop();
        PerformanceCounterHandler.Instance.SetAveragePerformanceCounter(operationName, _startTime.ElapsedTicks);
    }
}

public object BeforeCall(string operationName, object[] inputs)
{
    Guid correlationState;

    if (_activated)
    {
        correlationState = Guid.NewGuid();
        _startTime = new Stopwatch();
        _startTime.Start();
        return correlationState;
    }
    return null;
}

这就是计数器的注册方式

foreach (string methodName in ServiceMethodNames)
                {
                    counter = new CounterCreationData(methodName, methodName + " > Genomsnittlig tid(ms)", PerformanceCounterType.AverageTimer32);
                    col.Add(counter);
                    counter = new CounterCreationData(methodName + "_base", methodName + " > Genomsnittlig tid(ms)", PerformanceCounterType.AverageBase);
                    col.Add(counter);
                }

设置性能计数器的方法如下所示:

public Boolean SetAveragePerformanceCounter(string performanceCounterName, long value)
        {
            PerformanceCounter performCounter;

            if (_useOrbitPerformanceCounters && (performCounter = _performanceCounters.Values.Where(c=> c.CounterName == performanceCounterName).FirstOrDefault()) != null)
            {
                performCounter.IncrementBy(value);
                performanceCounterName = performanceCounterName + "_base";
                performCounter = _performanceCounters[performanceCounterName];
                performCounter.Increment();
                return true;
            }
            return false;
        }

然而,性能计数器是否显示峰值而不是平均值?如果我更改视图以报告一切都是 0,只要我什么都不做?我需要能够看到现在的平均通话时间,即使目前没有通话。我究竟做错了什么?

PerformanceCounter


问题是,AverageTimer32没有显示一些历史平均值。来自文档:

平均计数器,用于测量完成流程或操作平均所需的时间。这种类型的计数器显示采样间隔的总经过时间与该时间内完成的进程或操作的数量的比率。该计数器类型以系统时钟的滴答声为单位测量时间。 公式:((N1 - N0)/F)/(B1 - B0),其中 N1 和 N0 是性能计数器读数,B1 和 B0 是其对应的 AverageBase 值,F 是每秒的滴答数。

有趣的部分是公式。性能计数器仅显示两个性能计数器读数之间的平均值。因此,如果没有发出任何请求,则结果值为 0,因为分子为 0。

也许可以通过某种方式自行计算该值并通过其他类型的性能计数器公开它。

编辑: 我编写了一个演示应用程序来演示解决方法,但感觉很混乱。我创建了一个NumberOfItems32性能计数器。

var counterDataCollection = new CounterCreationDataCollection();

var averageRandomNumer = new CounterCreationData
{
    CounterType = PerformanceCounterType.NumberOfItems32,
    CounterName = averageRandomNumberCounterName,
    CounterHelp = "Views the average random number."
};
counterDataCollection.Add(averageRandomNumer);

PerformanceCounterCategory.Create(
    categoryName,
    "Displays the various performance counters of a test application",
    PerformanceCounterCategoryType.MultiInstance,
    counterDataCollection);

并像这样设置值:

var averageRandomNumberPerfCounter = new PerformanceCounter(categoryName, averageRandomNumberCounterName, "firstInstance", false);
var random = new Random();
var currentAverage = 0d;
var numberOfReadings = 0L;

while (true)
{
    var nextRandom = random.Next(1, 101);

    // ATTENTION: real code should handle overflow properly
    numberOfReadings++;
    currentAverage = (((numberOfReadings - 1) * currentAverage) + nextRandom) / numberOfReadings;

    averageRandomNumberPerfCounter.RawValue = (long)currentAverage;

    Thread.Sleep(1000);
}

这种解决方案的缺点是显而易见的。由于性能计数器只能存储long你会失去平均值的小数位。此问题的另一个解决方法是缩放您的值,例如将它们乘以 10,然后在性能监视器中选择较低的缩放比例。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么使用平均值时图表会出现尖峰? 的相关文章

  • C# 异步任务比同步慢

    你知道为什么同步斐波那契方法比异步 等待更快并且比异步任务更快吗 我在每个项目方法上都使用了异步 所以主要是这是一个非常糟糕的方法 Code static int FibonacciSync int number if number 0 r
  • 在VB.NET中获取文件修改日期

    我的文件夹中有许多文件 我需要获取最后修改日期 所以我用了 FDate IO File GetLastWriteTime FName 对于某些文件 它工作正常 但对于其他文件 我得到的日期为 1 1 1601 但是当我在 Windows 资
  • 如何使用c#从数据桶中获取所有文档?

    如何获取数据桶中的所有文档 我尝试过一个示例 但我只能获得一个特定的文档 这是我的代码 CouchbaseClient oclient oclient new CouchbaseClient vwspace data bucket name
  • 我可以将 char 或 DateTime 设置为 null 吗?

    我可以将 null 设置为char数据类型 并且DateTime在 C 中 多谢你们 这是不可能的 它是一个值类型 使用 char myChar null DateTime myDate null 这相当于 Nullable
  • 原子存储抛出错误

    我最近升级到了 C 11 兼容编译器 并且尝试将一些代码从 boost 更新到 c 11 标准 我在使用atomic store转换一些代码时遇到了问题 这是一些简单的测试代码 似乎会引发编译器错误 int main std shared
  • 检测反射 DLL 注入

    在过去的几年中 恶意软件 以及一些渗透测试工具 如 Metasploit 的 meterpreter 负载 已经开始使用反射 DLL 注入 PDF http www harmonysecurity com files HS P005 Ref
  • 如何在 C++ 和 QML 应用程序中使用 qrc?

    我在 Windows7 上用 c qnd Qt Creator QML 编写了 Qt Quick Desktop 应用程序 现在 我必须部署它 并且我需要隐藏 qml 文件和图像 意味着 将它们放入资源等中 我读到有一个很好的方法可以使用
  • 模板与非模板类,跨编译器的不同行为

    我在一些应用程序中使用编译时计数器 它确实很有用 昨天我想用 gcc 编译一个程序 我之前使用的是 msvc 并且计数器的行为在模板类中发生了变化 它在模板类中不再工作 过于简化的代码 Maximum value the counter c
  • 未使用的功能会产生什么后果

    我想知道在代码中使用未使用的函数会产生什么 如果有什么后果 如果您查找并删除所有未使用的函数和变量 性能是否会有明显的改进 或者删除未使用的函数和变量只是一个好习惯 未使用的功能不会损害性能 他们让维护代码的人的工作变得更加困难 现代 ID
  • ASP.NET MVC 动作过滤器

    有谁知道即使在 CATCH 块中 ActionFilterAttribute 类的 OnResultExecuted 方法是否也会执行 ie CookiesActions public ActionResult Login Usuarios
  • 如何在 C++ 运行时更改 QML 对象的属性?

    我想在运行时更改 QML 对象的文本 我尝试如下 但文本仍然为空 这是后端类 class BackEnd public QObject Q OBJECT Q PROPERTY QString userFieldText READ userF
  • 查找方法不适用于 EF6.1 模拟

    我已经使用这些 msdn 指南设置了模拟 使用模拟框架进行测试 EF6 及以上 http msdn microsoft com en us data dn314429 var bsAc db BusAcnts FirstOrDefault
  • 如何禁用基于 ValidationRule 类的按钮?

    如何禁用基于 ValidationRule 类的 WPF 按钮 下面的代码可以很好地突出显示 TextBox
  • 应在堆栈上分配的最大数量

    我一直在寻找堆栈溢出有关应在堆栈上分配的最大内存量的指南 我看到了堆栈与堆分配的最佳实践 但没有关于应该在堆栈上分配多少以及应该在堆上分配多少的指南 有什么想法 数字可以作为指导吗 什么时候应该在堆栈上分配 什么时候应该在堆上分配 多少才算
  • 意外的 const 引用行为

    include
  • 如果仅使用第一个元素,是否必须为整个结构分配内存?

    我有一个结构 其中第一个元素被测试 并且根据其值 结构的其余部分将被读取或不会被读取 在第一个元素的值指示结构的其余部分不会被读取的情况下 我是否必须为整个结构或仅第一个元素分配足够的内存 struct element int x int
  • 展开 std::reference_wrapper 的成本

    Given include
  • 使用C标准数学库精确计算标准正态分布的CDF

    标准 C 数学库不提供计算标准正态分布 CDF 的函数 normcdf 然而 它确实提供了密切相关的函数 误差函数 erf 和互补误差函数 erfc 计算 CDF 的最快方法通常是通过误差函数 使用预定义常量 M SQRT1 2 来表示 d
  • 在 C# 中使用自定义千位分隔符

    在显示字符串时 我尝试不使用 字符作为千位分隔符 而是使用空格 我想我需要定义一种自定义文化 但我似乎做得不对 有什么指点吗 例如 将 1000000 显示为 1 000 000 而不是 1 000 000 no String Replac
  • 在 LP2844Z(Zebra 打印机)上的收据中包含 PNG [重复]

    这个问题在这里已经有答案了 我正在致力于创建一个基于 HTML5 画布的签名 绘图框 目前我们在服务器上将画布保存为PNG 但可以轻松地将base64字符串保存在数据库中 现在的问题是我们如何在打印的收据上添加签名 目前我们使用 GF 字段

随机推荐

  • 命名管道上的 WriteFile 有时会返回 ERROR_NO_DATA

    我有一个 C 程序 它正在创建一个命名管道来写入数据 有客户反映了客户端连接命名管道但服务器端写入数据失败的情况 用ERROR NO DATA 我能找到的任何 MSDN 页面都没有真正解释此错误代码 有人对如何解决这个问题有任何想法吗 或者
  • Spring Security 更新身份验证成功后的上次登录日期

    如何在身份验证成功时触发我的方法 我想更新我的数据库列 上次登录日期 在谷歌上查了一下 但仍然不明白应该如何完成 这是我的 spring security xml
  • 在.NET中使用PEM编码的RSA私钥

    我有一个私钥 如下所示 开始 RSA 私钥 一些私钥数据 结束 RSA PRIVA 我需要在我的 C 项目中使用此密钥 但我找不到任何如何使用此格式的密钥的示例 谢谢 步骤 1 获取 一些私钥数据 content remove BEGIN
  • 验证 ADF 移动应用程序中的用户名和密码

    我正在 adf 移动应用程序中开发一个简单的登录页面 以下是现在登录 amx 页面中的一段代码
  • SQL trunc/group/order by 日期(日/月/季度/年),总和跳过日期,没有数据

    我参与了一个需要按日期构建直方图的项目 在我之前 这是通过 Java 代码对每个矩形 日期子区域 对数据库进行大量 SQL 查询来完成的 我尝试另一种方法 select sum CNT trunc DATE MM from DATA whe
  • 在 Windows 上,mkbundle 因链接器错误而失败

    我正在尝试构建一个需要在可能未安装 NET 的环境中运行的控制台实用程序 Mono 的 mkbundle 似乎是解决这个问题的一个很好的解决方案 但是当在 Windows 10 上通过 cygwin 在一个简单的项目上运行 mkbundle
  • 使用任意 QML 项目作为缓存图像源

    编辑 原来的问题仍然包含在下面 但我决定重新命名为一个表单 该表单在各种情况下对开发人员更有用 其中一些在我的回答中描述 因为原始问题的解决方案变成了提供更广泛的应用领域 我有一组应用程序的灰度图标 并且要求用户可以更改图标颜色 因此 显而
  • 在 Firebird 的服务器端使用生成器值时,如何不浪费它们?

    检查这段简单的代码 它使用生成器在 Firebird 表中创建唯一的主键 CREATE OR ALTER TRIGGER ON BEFOREINSERT PK BOOKING ITEM FOR BOOKING ITEM BEFORE INS
  • 访问隐藏在第三个扩展类中的间接超类变量

    假设我有如下代码 class A int a 1 class B extends A int a 2 class C extends B int a 3 void print it int a 4 Local variable a to t
  • .NET - 函数变量存储在地址空间的堆或堆栈上?

    我在一次考试中遇到了如下问题 当程序调用函数时 其中的数据结构类型是 为该函数中的变量分配的内存 HEAP QUEUE LIFO STACK 根据测试 HEAP是正确答案 虽然我选择了STACK 有很棒的人可以解释一下为什么吗 提前致谢 首
  • CSS - 具有等边距和固定大小块的响应式网格

    我正在尝试突破 CSS 的限制 以复制印刷中常见的网格布局 要求 块之间以及块与容器边缘之间的边距必须相等 布局必须具有响应性 并且每行上的块数必须适应窗口的大小 最后一行必须左对齐 块的宽度 高度是固定的 不使用空的非语义 HTML 元素
  • 使用 Powershell 将文件上传到 Sharepoint Online (Microsoft 365)(选项 1-使用 PnP.Powershell)

    我正在尝试将文件上传到 Sharepoint Online M365 库子文件夹中 但它不断出现错误 我尝试过很多脚本 这篇文章是关于使用 PnP Powershell 我已经发布了有关其他脚本的问题 希望有人可以帮助我解决其中任何一个问题
  • Spring 和 HTTP 选项请求

    作为对此的后续question 我想知道如何在 spring 3 mvc 应用程序中处理 OPTIONS 请求 我不想为我的 spring 代码中的每个端点编写选项处理方法 但是建议的选项处理程序到 的映射仅适用于还没有处理程序的端点 所以
  • 我可以在 Android 中设置 AlarmManager 的结束时间吗?

    我已经设置了一个AlarmManager在特定时间响起 然后每隔一段时间重复一次 是否可以告诉它在多少间隔后停止 甚至什么时候停止 这是我到目前为止所拥有的 Calendar calendar Calendar getInstance ca
  • 避免异步在方法签名中传播

    阻止我在 net 代码中不断使用异步 等待模式的原因是 一旦创建异步方法 async 关键字就会在我的代码中传播 迫使我使所有方法异步 有没有一种模式可以有效地阻止这种情况 阻止我在 net 代码中不断使用异步 等待模式的原因是 一旦创建异
  • 如何获得随机颜色而不重复?

    我想为每个门获得随机颜色 所以我有 9 个门 9 种材料和 9 种颜色 现在我希望每个门都获得随机颜色 但颜色不能重复 例如 不能2 种红色或 3 种蓝色 各一种 感谢帮助enter image description here 这是我尝试
  • 外国时间与当地时间

    我正在尝试将外国时间转换为当地时间 我正在获取日期和时间Europe London 目前我正在使用时刻时区来让我的代码正常工作 但是它给了我错误的输出 resultDate new moment 2017 06 30T22 10 00 tz
  • 有没有办法突出显示日历中的单元格?

    我知道有一种方法可以突出显示单元格TStringGrid 我可以使用它 但是输入日期 日期和月份将是一个大问题 除非您知道如何做到这一点 是的 如果您只对控件的源代码进行少量修改 这很容易 具体来说 我们需要在其上添加少量代码DrawCel
  • 关于 ruby​​ 哈希值的恼人问题

    为什么 ruby 有时会将哈希解释为代码块 例如 我有一个名为 required 的函数 它需要哈希值 所以我这样做 required base uri String endpoints String destination String
  • 为什么使用平均值时图表会出现尖峰?

    我在 WCF 服务中使用 messageInspectors 来测量每个服务方法的运行时间 如下所示 public void AfterCall string operationName object outputs object retu