【问题标题】:c# how long does it take to start a taskc#启动一个任务需要多长时间
【发布时间】:2017-10-25 20:37:44
【问题描述】:

只是想知道创建任务需要多长时间:

Task<int> tsk = Task<int>.Factory.StartNew(() => ReadOscilloscopeData(2, val.ADC_PSC, val.ADC_ARR, val.ADCSAMPLES, val.ADCFRAMES, val.NCHANNELS, 1000, out outdata));

【问题讨论】:

  • 使用秒表类检查
  • 这取决于很多事情,因为任务已被调度,调度程序将决定何时是运行该任务的最佳时间
  • 您想知道什么时间跨度? Task.TaskFactory.StartNew 什么时候返回或者任务什么时候开始运行?
  • 只是想知道。现在大约是 3 毫秒,我会考虑到它。
  • @Sir Rufo no - 但我可以在任务中停止秒表。

标签: c# performance time task


【解决方案1】:

为什么不用秒表看呢?

var stopWatch = new Stopwatch();
stopwatch.Start();
Task<int> tsk = Task<int>.Factory.StartNew(() => ReadOscilloscopeData(2, val.ADC_PSC, val.ADC_ARR, val.ADCSAMPLES, val.ADCFRAMES, val.NCHANNELS, 1000, out outdata));
stopwatch.Stop();
Console.WriteLine(stopwatch.Elapsed);

【讨论】:

  • 太棒了。我没有,因为我认为它需要不到 1 毫秒。我已经检查过了,在我的电脑上大约需要 3 毫秒。
  • @PeterJ 要获得任何类型的真实数据,您需要的不仅仅是一次测量。即便如此,您也只有一个平均值,因为调度取决于您无法控制的许多条件。为初学者设置一个可以启动数千次任务的基准。
  • 仅供参考:在我的系统上,first Task.Run(...) 大约需要 25ms,而接下来的所有 Task.Run() 大约需要 0ms(平均约 50 个滴答声 => 1000 个滴答声 = 1 毫秒)。在创建第一个任务时,会有某种类型的线程池初始化,这需要一些时间。在测量时,我们必须小心,我们真正要测量什么,并期望在“冷”或“热”环境中得到不同的结果。
【解决方案2】:

实际上,这取决于许多条件。
例如,如果线程池耗尽,它将等待 0.5-1 秒以使任何现有线程产生,如果此时没有释放它们,它将创建一个额外的线程来运行您的任务。
你可以在here这个主题上找到相当详尽的调查。

【讨论】:

  • 谢谢 - 但因为我在特定时刻只有一个后台任务 - 我永远不会用完空闲任务。
猜你喜欢
  • 1970-01-01
  • 2013-04-14
  • 2018-01-17
  • 2023-03-23
  • 1970-01-01
  • 2019-05-05
  • 2014-05-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多