【问题标题】:How much time spent in a .NET Thread?在 .NET 线程中花费了多少时间?
【发布时间】:2010-10-04 09:25:56
【问题描述】:

我有一个带有 (4) 个线程的多线程应用程序,我想知道在线程中花费了多少处理时间。我用 ThreadPool 创建了所有这些线程

线程1在做job1
线程 2 做作业 2
..
..

结果是:
Thread1 在 12 毫秒内运行
Thread2 在 20 毫秒内运行

我实际上已经在一个作业中下载了一个网页,每个作业都在一个线程中处理我想知道下载一个网页需要多少时间(在计算中不受其他线程上下文切换的影响时间

【问题讨论】:

    标签: c# .net multithreading


    【解决方案1】:

    我在 codeproject 上找到了这段代码:

    http://www.codeproject.com/KB/dotnet/ExecutionStopwatch.aspx

    尝试并报告;)

    【讨论】:

    • 您的答案正是我所需要的,谢谢,但是对于我在问题底部所说的问题是否正确?
    • 您将获得加载网页的 CPU 时间,而不是网页加载时间。 (如果我正确理解了这个问题)
    【解决方案2】:

    如果您想从秒表中获取总时间,可以使用 Stopwatch 类:

    Stopwatch sw = Stopwatch.StartNew();
    // execute code
    sw.Stop();
    // read and report on sw.ElapsedMilliseconds
    

    如果您想了解线程实际执行代码的时间(而不是等待 I/O 等),您可以检查 ProcessThread.TotalProcessorTime 属性,方法是为您的对象枚举 Process 对象的线程应用。

    请注意,线程池中的线程在使用后不会被销毁,而是留在池中以供重复使用,这意味着您的线程总时间包括它在当前工作负载之前所做的一切。

    【讨论】:

    • 那么有什么办法可以知道线程等待IO的时间是多少??
    • 好吧,如果您的意思是“一直没有执行代码”,那么唯一的方法是使用秒表测量它,然后减去总处理器时间。请注意,通过添加代码来执行此操作,您会增加开销,尽管它可能很小,并且如果您的线程没有做很多事情,所以您得到的数字很小,开销可能会对您获得的时间产生重大影响出它。你具体想做什么?
    • 亲爱的 Lasse,我的应用程序正在一个线程中下载许多 wab 页面,例如,我想知道每个目标网站对我的请求的响应时间(我在 12 毫秒内从 site1 下载了 page1)没有带宽中其他线程下载其页面的影响,是否清楚?
    【解决方案3】:

    WMI 类Win32_Thared 包含属性KernelModeTimeUserModeTime,如果可用,它们将为您提供100ns 的实际执行单位计数。

    但是,来自documentation

    如果此信息不可用,则应使用值 0(零)。

    所以这可能取决于操作系统(在 Win7 上肯定会在此处填充)。

    类似select * from win32_thread where ProcessHandle="x" 的查询将获得进程ID xWin32_Thread 实例(忽略名称中的“句柄”)。例如,使用 PowerShell,查看它自己的线程:

    PS[64bit] > gwmi -Query "select * from win32_thread where ProcessHandle=""7064"""|
    ft -AutoSize Handle,KernelModeTime,UserModeTime
    
    Handle KernelModeTime UserModeTime
    ------ -------------- ------------
    5548              218          312
    6620                0            0
    6112                0            0
    7148                0           15
    6888                0            0
    7380                0            0
    3992                0            0
    8372                0            0
    644                 0            0
    1328                0           15
    

    (并确认这不是经过的时间,过程开始时间是2010-09-30 16:44:50。

    【讨论】:

    • 这是一件很棒的事情!但我认为它不能解决我在@Lasse V Karlsen 的 cmets 中所说的问题
    【解决方案4】:

    做不到。问题是,除非你阻止它(很难做到——毫无意义),否则线程可能会被中断。因此,虽然它需要 THread2 20 毫秒才能完成,但您不知道其中有多少是活动的。

    所谓的抢先式多任务处理的负面影响。

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-23
    • 1970-01-01
    • 2017-05-10
    • 2015-08-02
    • 2017-02-15
    • 2020-07-23
    相关资源
    最近更新 更多