精确测量线程中代码的执行时间(C#)

2024-01-03

我试图在多个线程上尽可能准确地测量某些代码的执行时间,同时考虑上下文切换和线程停机时间。该应用程序是用 C# (VS 2008) 实现的。例子:

public void ThreadFunc ()
{
    // Some code here

    // Critical block #1 begins here
    long lTimestamp1 = Stopwatch.GetTimestamp ();

    CallComplex3rdPartyFunc (); // A

    long lTimestamp2 = Stopwatch.GetTimestamp ();
    // Critical block #1 ends here

    // Some code here

    // Critical block #2 begins here
    long lTimestamp3 = Stopwatch.GetTimestamp ();

    CallOtherComplex3rdPartyFunc (); // B

    long lTimestamp4 = Stopwatch.GetTimestamp ();
    // Critical block #2 ends here

    // Save timestamps for future analysis.
}

public int Main ( string[] sArgs )
{
    // Some code here

    int nCount = SomeFunc ();

    for ( int i = 0; i < nCount; i++ )
    {
        Thread oThread = new Thread ( ThreadFunc );
        oThread.Start ();
    }

    // Some code here

    return ( 0 );
}

我想尽可能准确地测量上述两个关键代码块的执行时间。这两个调用标记为A and B可能是长函数调用,有时可能需要几秒钟才能执行,但在某些情况下可能会在几毫秒内完成。

我在多个线程上运行上述代码 - 1 到 200 个线程之间,具体取决于用户输入。运行此代码的计算机有 2-16 个核心 - 用户在较弱的计算机上使用较低的线程数。

问题是A and B两者都可能是长函数,因此在执行期间很可能至少会发生一次上下文切换 - 可能不止一次。因此代码获取lTimestamp1,然后另一个线程开始执行(并且当前线程等待)。最终当前线程重新获得控制权并检索 lTimestamp2。

这意味着之间的持续时间l时间戳1 and l时间戳2包括线程实际未运行的时间 - 当其他线程执行时,它正在等待再次调度。然而,滴答计数无论如何都会增加,所以持续时间现在实际上是

代码块时间 = A + B +在其他线程中花费了一些时间

虽然我希望它只是

代码块时间 = A + B

对于大量线程来说,这尤其是一个问题,因为它们都有机会运行,因此上述计时会更高,而所有其他线程在相关线程获得另一次运行机会之前运行。

所以我的问题是:是否有可能以某种方式计算线程运行的时间not运行然后相应地调整上述时间?我想完全或至少尽可能多地消除(减去)第三项。该代码运行了数百万次,因此最终的时间是根据大量样本计算出来的,然后取平均值。

我不是在寻找探查器产品等 - 应用程序需要尽可能准确地对这些标记的部分进行计时。功能A and B是第三方功能,我无法以任何方式更改它们。我还意识到以纳秒精度测量时间时可能出现的波动以及这些第三方函数内部可能存在的开销,但我仍然需要进行此测量。

任何建议将不胜感激 - C++ 或 x86 汇编代码也可以工作。

Edit:似乎不可能实现这一点。 Scott 下面的想法(使用 GetThreadTimes)很好,但不幸的是 GetThreadTimes() 是一个有缺陷的 API,它几乎从不返回正确的数据。感谢所有的答复!


这可以通过 Native API 调用来完成获取线程时间 http://msdn.microsoft.com/en-us/library/windows/desktop/ms683237.aspx。这是一篇文章在代码项目上 http://www.codeproject.com/KB/dotnet/ExecutionStopwatch.aspx使用它的。

第二个选项是使用查询线程周期时间 http://msdn.microsoft.com/en-us/library/windows/desktop/ms684943.aspx。这不会给您时间,但会给您当前线程已执行的周期数。

请注意,您不能直接转换cycles->seconds由于许多处理器(尤其是移动处理器)不以固定速度运行,因此没有一个常数可以乘以得到以秒为单位的经过时间。但是,如果您使用的处理器不改变其速度,那么从周期中获取挂钟时间将是一个简单的数学问题。

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

精确测量线程中代码的执行时间(C#) 的相关文章

  • 将处理后的图形绘制到另一个图形中

    我想将一个经过处理的图形绘制到另一个图形中 I have two graphics var gHead Graphics FromImage h var gBackground Graphics FromImage b Transform
  • Mono 无法保存用户设置

    我在 Mono Ubuntu 上保存用户设置时遇到问题 这是代码示例 private void Form1 Load object sender EventArgs e string savedText Properties Setting
  • Qt - 无法让 lambda 工作[重复]

    这个问题在这里已经有答案了 我有以下功能 我想在其中修剪我的std set
  • 在 C++ 中分割大文件

    我正在尝试编写一个程序 该程序接受一个大文件 任何类型 并将其分成许多较小的 块 我想我已经有了基本的想法 但由于某种原因我无法创建超过 12 kb 的块大小 我知道谷歌等上有一些解决方案 但我更感兴趣的是了解这个限制的根源是什么 然后实际
  • 通信对象 System.ServiceModel.Channels.ServiceChannel 不能用于通信

    通信对象System ServiceModel Channels ServiceChannel 无法用于通信 因为它处于故障状态 这个错误到底是什么意思 我该如何解决它 您收到此错误是因为您让服务器端发生 NET 异常 并且您没有捕获并处理
  • try-catch 中未处理的异常

    try list from XElement e in d Descendants wix File where e Attribute Name Value Contains temp Name e Parent Parent Attri
  • 在 Xcode4 中使用 Boost

    有人设置 C Xcode4 项目来使用 Boost 吗 对于一个简单的 C 控制台应用程序 我需要在 Xcode 中设置哪些设置 Thanks 用这个来管理它 和这个
  • 调试内存不足异常

    在修复我制作的小型 ASP NET C Web 应用程序的错误时 我遇到了 OutOfMemoryException 没有关于在哪里查看的提示 因为这是一个编译时错误 如何诊断此异常 我假设这正是内存分析发挥作用的地方 有小费吗 Thank
  • 如何在 VS 中键入时显示方法的完整文档?

    标题非常具有描述性 是否有任何扩展可以让我看到我正在输入的方法的完整文档 我想查看文档 因为我可以在对象浏览器中看到它 其中包含参数的描述和所有内容 而不仅仅是一些 摘要 当然可以选择查看所有覆盖 它可能是智能感知的一部分 或者我不知道它并
  • 在 C# 中将位从 ulong 复制到 long

    所以看来 NET 性能计数器类型 http msdn microsoft com en us library system diagnostics performancecounter aspx有一个恼人的问题 它暴露了long对于计数器
  • Xamarin Android:获取内存中的所有进程

    有没有办法读取所有进程 而不仅仅是正在运行的进程 如果我对 Android 的理解正确的话 一次只有一个进程在运行 其他所有进程都被冻结 后台进程被忽略 您可以使用以下代码片段获取当前正在运行的所有 Android 应用程序进程 Activ
  • gdb 在 docker 上立即退出“进程已完成,退出代码 1”或 lldb“数据包返回错误 8”。另外:如何在 docker 中允许进行 C++ 调试

    这花了我一整天的时间才找到 所以我将其发布以供将来参考 我正在 docker 镜像上开发 C 我正在使用克利翁 我的代码是在调试模式下编译的 并且在运行模式下运行良好 但是当尝试调试时 进程会立即退出 并显示非常丰富的信息 Process
  • 在 C 中复制两个相邻字节的最快方法是什么?

    好吧 让我们从最明显的解决方案开始 memcpy Ptr const char a b 2 调用库函数的开销相当大 编译器有时不会优化它 我不会依赖编译器优化 但即使 GCC 很聪明 如果我将程序移植到带有垃圾编译器的更奇特的平台上 我也不
  • UWP 无法在两个应用程序之间创建本地主机连接

    我正在尝试在两个 UWP 应用程序之间设置 TCP 连接 当服务器和客户端在同一个应用程序中运行时 它可以正常工作 但是 当我将服务器部分移动到一个应用程序并将客户端部分移动到另一个应用程序时 ConnectAsync 会引发异常 服务器未
  • 32位PPC rlwinm指令

    我在理解上有点困难rlwinmPPC 汇编指令 旋转左字立即然后与掩码 我正在尝试反转函数的这一部分 rlwinm r3 r3 0 28 28 我已经知道什么了r3 is r3在本例中是一个 4 字节整数 但我不确定这条指令到底是什么rlw
  • gdb查找行号的内存地址

    假设我已将 gdb 附加到一个进程 并且在其内存布局中有一个文件和行号 我想要其内存地址 如何获取文件x中第n行的内存地址 这是在 Linux x86 上 gdb info line test c 56 Line 56 of test c
  • 无法使用 Ninject 将依赖项注入到从 Angular 服务调用的 ASP.NET Web API 控制器中

    我将 Ninject 与 ASP NET MVC 4 一起使用 我正在使用存储库 并希望进行构造函数注入以将存储库传递给其中一个控制器 这是实现 StatTracker 接口的上下文对象 EntityFramework public cla
  • 如何在 GCC 5 中处理双 ABI?

    我尝试了解如何克服 GCC 5 中引入的双重 ABI 的问题 但是 我没能做到 这是一个重现错误的非常简单的示例 我使用的GCC版本是5 2 如您所见 我的主要函数 在 main cpp 文件中 非常简单 main cpp include
  • 以编程方式使用自定义元素创建网格

    我正在尝试以编程方式创建一个网格 并将自定义控件作为子项附加到网格中 作为 2x2 矩阵中的第 0 行第 0 列 为了让事情变得更棘手 我使用了 MVVM 设计模式 下面是一些代码可以帮助大家理解这个想法 应用程序 xaml cs base
  • Swagger 为 ASP.CORE 3 中的字典生成错误的 URL

    当从查询字符串中提取的模型将字典作为其属性之一时 Swagger 会生成不正确的 URL 如何告诉 Swagger 更改 URL 中字典的格式或手动定义输入参数模式而不自动生成 尝试使用 Swashbuckle 和 NSwag 控制器 pu

随机推荐

  • 正则表达式匹配由任何字符分组包围的可选组

    我正在尝试匹配一个可选组 该组前面和后面可以有任意数量的字符 整个模式也有必需的开始和结束匹配 但中间的匹配是可选的 我从这个开始 当需要中间组时它有效 string text blah blah foo This is a test bl
  • Python Google Drive API - 获取“我的云端硬盘”文件夹的 ID

    在 Python 3 中使用 Drive API 我正在尝试编写一个脚本来下载整个用户的 Google Drive 此代码来自 Drive API V3 文档 经过修改以搜索文件夹而不是文件 将获取用户拥有所有权的每个文件夹 包括团队驱动器
  • 如何在 JSDoc 中将参数标记为包含 DOM 节点?

    我想指示参数应该是 DOM 节点 但我似乎找不到任何有关如何使用 JSDoc 指示这一点的信息 我可以用 Object 但这相当难看 我宁愿有类似的东西 Node or DOMNode 但我找不到任何例子来指出我的方向 那么 如何将参数标记
  • BlueZ 在 DBUS 上显示旧的缓存数据

    我对 BlueZ 有一个非常奇怪的问题 Ubuntu 16 04 中的库存版本 5 37 我正在开发蓝牙外围设备 我只有一套开发套件 在其固件中 我更改了广播的名称 当我使用时 hcitool lescan 显示我的设备的更新名称 但是当我
  • 使用 Collections API 进行随机播放

    我感到非常沮丧 因为我似乎无法弄清楚为什么集合洗牌无法正常工作 可以说我正在尝试洗牌randomizer大批 int randomizer new int 200 300 212 111 6 2332 Collections shuffle
  • 在 PhoneGap+jQuery Mobile 中使用 ajax 的 CORS 无法在设备上运行,但可以在浏览器上运行

    因此 我正在使用 Phone Gap 和 jQuery mobile 构建一个应用程序 当使用 ajax 从白名单服务器获取 json 响应时 我收到错误响应 但是控制台中没有显示任何内容 奇怪的是 当在网络浏览器中测试该应用程序时 它工作
  • 使用 Mongoose 处理 MongoDB 中查找、修改、保存流程中的冲突

    我想更新一个涉及读取其他集合和复杂修改的文档 因此更新运算符findAndModify 不能达到我的目的 这是我所拥有的 Collection findById id function err doc read from other col
  • 如何将消息从 WH_KEYBOARD_LL 转换为 corespondig unicode char

    你好 我正在编写一个多语言应用程序 并且正在使用WH KEYBOARD LL钩 我不在乎为什么要使用钩子 我尝试了多种方法 但这是最简单 最快的方法 现在在钩子过程中 LRESULT CALLBACK LowLevelKeyboardPro
  • 在每个视图 IOS 的底部显示音乐播放器 [关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 我正在创建一个 IOS 应用程序 我想在每个视图的底部显示音乐播放器实例 Like this image 采用一个基本视图控制器 它将以编程
  • 使用 Robolectric 进行 Android http 测试

    我有一个 Android 应用程序 其中应用程序的主要部分是 APIcalls java 类 我在其中发出 http 请求以从服务器获取数据并在应用程序中显示数据 我想为这个 Java 类创建单元测试 因为它是应用程序的大部分 从服务器获取
  • 为什么 PreventDefault 不起作用?

    这是我的代码的一部分 如果我尝试将图像放在块上 preventDefault 不起作用 jQuery document ready function event props push dataTransfer imgDropzone on
  • Python SciPy 卷积与 fftconvolve

    我知道一般来说FFT and multiplication通常比直接更快convolve当数组比较大的时候进行操作 然而 我正在将一个很长的信号 比如 1000 万个点 与一个很短的响应 比如 1000 个点 进行卷积 在这种情况下fftc
  • 如何使用 execvp()

    用户将读取一行 我将保留第一个单词作为 execvp 的命令 假设他会打字 猫文件 txt 命令将是 cat 但我不知道如何使用这个execvp 我读了一些教程 但还是没明白 include
  • 依赖注入容器有什么好处?

    我了解依赖注入本身的好处 我们以 Spring 为例 我还了解其他 Spring 功能的好处 例如 AOP 不同类型的帮助器等 我只是想知道 XML 配置有什么好处 例如
  • Java 安全性:通过 URLClassLoader 加载的沙箱插件

    问题摘要 如何修改下面的代码 以便不受信任的动态加载代码在安全沙箱中运行 而应用程序的其余部分保持不受限制 为什么 URLClassLoader 不像它所说的那样处理它 编辑 更新以回应 Ani B 编辑 2 添加了更新的 PluginSe
  • 无法从动态添加的复选框获取值

    单击按钮时我添加了一个复选框 最后需要通过单击提交按钮来获取所有选中的复选框值 这是我的代码 mIncrementButton setOnClickListener new View OnClickListener Override pub
  • 使用 gmaven 插件获取 org.codehaus.groovy.control.MultipleCompilationErrorsException

    这是我的示例程序 在使用 mvn 编译时它会抛出编译错误 我正在尝试使用 ExpandoMetaClass 添加静态方法 Singleton class ThrowError def parse println Anish ThrowErr
  • Android 中无法使用 WebView 加载网页

    我最近开始从事 Android 开发 并且希望使用 WebView 显示网页 我从 Google 网站上提供的示例中获取 由于某种原因 模拟器一直说页面不可用 我在 StackOverflow 中搜索并找到了与 WebViewClient
  • 在对象的生命周期中,“this”指针的值是否恒定?

    的值是this保证指针在特定对象的生命周期内保持不变 我无法想象它会改变的情况 但不知道我是否错过了一些东西 的值是this保证指针在特定对象的生命周期内保持不变 Yes As user Aconcagua https stackoverf
  • 精确测量线程中代码的执行时间(C#)

    我试图在多个线程上尽可能准确地测量某些代码的执行时间 同时考虑上下文切换和线程停机时间 该应用程序是用 C VS 2008 实现的 例子 public void ThreadFunc Some code here Critical bloc