c# - 使用秒表测量时间关键的代码片段
问题描述
所以我正在尝试分析我编写的以下代码片段:
private void Scrn_Timer_Tick(object sender, EventArgs e)
{
watcher.Start();
try
{
using (Bitmap bmpScreenshot = new Bitmap(Program.ScreenParameters.ScreenshotWidth, Program.ScreenParameters.ScreenshotHeight))
{
using (Graphics gfxScreenshot = Graphics.FromImage(bmpScreenshot))
{
gfxScreenshot.CopyFromScreen(Program.ScreenParameters.FromX, Program.ScreenParameters.FromY, 0, 0, size, CopyPixelOperation.SourceCopy);
var rect = new Rectangle(0, 0, bmpScreenshot.Width, bmpScreenshot.Height);
var data = bmpScreenshot.LockBits(rect, ImageLockMode.ReadWrite, bmpScreenshot.PixelFormat);
var depth = Bitmap.GetPixelFormatSize(data.PixelFormat) / 8; //bytes per pixel
var screenshotData = new byte[data.Width * data.Height * depth];
//copy pixels to buffer
//Marshal.Copy(data.Scan0, screenshotData, 0, screenshotData.Length);
Parallel.ForEach(Program.slaveList, slave =>
{
Marshal.Copy(data.Scan0, slave.image, 0, screenshotData.Length);
slave.Notify();
});
bmpScreenshot.UnlockBits(data);
}
}
}
catch(Exception ex)
{
logger.Debug(ex);
}
watcher.Stop();
logger.Debug("Iteration-Time 'Scrn_Timer_Tick': " + watcher.Elapsed.TotalMilliseconds);
watcher.Reset();
}
这是一个 System.Timers.Timer,每 30 毫秒计时一次。它制作屏幕截图,获取字节并将它们分发给连接到我系统的每个从站。所以我试图衡量整个过程,以了解我可以达到的 FPS。我的秒表持续显示 0 - 30 毫秒之间的值,这非常好。但我很恼火,因为我得到了很多显示为 0 的测量值。例如:
2018-11-05 13:56:59.9248 [16] DEBUG: Iteration-Time 'Scrn_Timer_Tick': 1,9086
2018-11-05 13:56:59.9404 [19] DEBUG: Iteration-Time 'Scrn_Timer_Tick': 0
2018-11-05 13:56:59.9716 [17] DEBUG: Iteration-Time 'Scrn_Timer_Tick': 0
2018-11-05 13:57:00.0028 [15] DEBUG: Iteration-Time 'Scrn_Timer_Tick': 0
2018-11-05 13:57:00.0496 [16] DEBUG: Iteration-Time 'Scrn_Timer_Tick': 10,9468
2018-11-05 13:57:00.0652 [17] DEBUG: Iteration-Time 'Scrn_Timer_Tick': 10,9468
2018-11-05 13:57:00.0964 [18] DEBUG: Iteration-Time 'Scrn_Timer_Tick': 0
2018-11-05 13:57:00.1432 [22] DEBUG: Iteration-Time 'Scrn_Timer_Tick': 0,8427
2018-11-05 13:57:00.1588 [19] DEBUG: Iteration-Time 'Scrn_Timer_Tick': 0,8427
2018-11-05 13:57:00.1900 [18] DEBUG: Iteration-Time 'Scrn_Timer_Tick': 0
2018-11-05 13:57:00.2368 [23] DEBUG: Iteration-Time 'Scrn_Timer_Tick': 7,0265
在这种情况下,我无法理解秒表应该显示 0。我的意思是,据我所知,测量点之间的处理总是至少在运行,如果它中止,我会捕捉到异常,但我什么也没看到。那么有人可以帮我解释一下这个 0 测量值是如何出现的吗?
解决方案
推荐阅读
- angular - 第二次无法调用角度服务
- python - 从不等长的体育比赛列表中创建 csv 文件
- python - 'OSError: [WinError 6] The handle is invalid' in PySimpleGUI while using '-w' in Pyinstaller, Speech Recognition and Pyttsx3
- javascript - 没有从电报登录中获取 user.username
- matlab - 求解器在 MATLAB 优化工具箱中获得解之前停止
- python - 刮掉搜索栏的价格 - 达到服务器限制
- node.js - 如何通过 UDP 套接字连接两个移动客户端
- svg - 如何在 FICO Xpress Workbench 中使用 SVG 显示图像
- python - 如何防止经过身份验证的用户发出直接 API 请求(Django rest 框架)
- mongodb - 聚合查询中的 MongoDb 连接列表