在delphi中提高计时器事件的性能

时间:2011-10-13 05:33:59

标签: delphi

我正在创建一个主要依赖于计时器的应用程序,

当计时器打勾我的应用程序将完成一项艰巨的任务;(我的任务经理说50%,在双核机器中,一个核心被完全使用)。 它在事件上创建了两个对象和17个变量。

我如何改善计时器事件的表现;以下是我的想法,请告诉我它是否会改善或恶化

  1. 全局创建和初始化局部变量(全局声明)
  2. 并发//可以在delphi中完成
  3. 使用带睡眠功能的循环代替计时器
  4. 我需要更多的idas来尽量减少定时器的间隔,并尽可能降低cpu的使用率

    迟缓的主要原因是嵌套4个循环;但我没有任何删除或减少它们的原因

    // ========================更新==================== =============================

    感谢您的回复,我的应用会监控网络摄像头并在检测到动作时发出警报; 但对不起,我不能在这里发布我的代码;但我可以告诉你代码周围发生了什么

    首先将图像分成25 * 25个图像; 2个循环用于此

    存储件的平均颜色被重新存储并与当前颜色进行比较;这个

    的2个循环

    然后应用程序将显示检测到动作的位置

    计时器间隔当前设置为300

4 个答案:

答案 0 :(得分:13)

创建2个类实例和17个变量将立即完成 - 在所有情况下,在比定时器分辨率更短的时间内完成。

所以你的计时器还有其他东西会烧掉你的CPU。数据访问,处理,计算。如果没有更多的信息和源代码,就无法猜测需要优化的是什么。

您需要的是个人资料您的应用。您在最新版本的Delphi中有AQTime,但您可以查看GPProfileProDelphi。如果需要,您可以使用profile-ready logging system like ours在客户端进行制作。然后你会看到什么是慢的,即大部分时间花在哪里。

使用带睡眠的循环(我认为在后台线程中)不会比计时器快。

恕我直言,快速重复任务是使用一些预先计算的表格。可能每次都不需要计算或检索一些数据。因此,您可以将这些数据存储在共享变量中,并在事件处理程序中使用它。始终认为更改算法或避免数据/硬件访问是速度的关键。并始终相信一个分析器,而不是你的第一直觉。

更新后的问题

因此,您的问题与图片的处理时间直接相关。你仍然需要实际的分析来猜测应该改进什么。我想你在这个计时器中检索图片。网络摄像头图片的过程不会花费300毫秒。因此可能使用后台线程来检索网络摄像头图像,将它们推入循环列表,然后让计时器仅在被要求时处理最新图像。但是需要对代码进行真正的分析

如果Delphi循环中的图片处理过程本身很慢,那么采样分析器将帮助您查看哪一行代码需要加速。在这种情况下的一些建议:

  • 尝试在每个循环中使用局部变量,以避免在嵌套循环中重新计算索引(使用指针)或值(将它们存储在堆栈中);
  • 尝试不是随机访问内存,而是每块阻止(为了更好的缓存性能);
  • 将数据对齐4或8字节对齐;
  • 展开内部循环(这可能是现代CPU上的主要问题) - 例如如果你合并一些像素块,硬编码代码中的块读取和计算,而不是使用for x := xRef-3 to xRef+3 do.. - 主要规则是避免代码中的任何分支 - if ... then或{{1} }出现在你的代码中,越多越好;
  • 考虑添加asm SSE / SSE2指令而不是pascal代码(困难部分,但也更强大),或使用第三方优化库进行处理 - 周围有几个运动检测库。

答案 1 :(得分:4)

  • 全局创建和初始化局部变量(声明它们 全局):可能无济于事,但会使代码混乱。本地 变量访问并不昂贵。

  • 并发//是否有可能 在德尔福做:可能,但在另外做错事 线程会占用CPU时间,就像在计时器中做错了一样 事件。更糟糕的是,你可能会创建更多的线程 一旦定时器在创建的线程之前重新触发 之前的计时器刻度已完成其工作

  • 使用带睡眠的循环 函数而不是计时器:可能会产生相同的结果,并且 还会阻止用户界面,使您的应用响应性降低

如果您发布代码和计时器设置,以及计时器的要求(这导致您的特定计时器设置),我将更新答案,使其更具建设性。

**更新/加法**

没有看到任何代码我只能估计你可能有很多Windows API调用。您可以监视使用什么值进行哪些调用,使用相同的参数值集合来识别那些调用,以及缓存,或完全取消循环,结果计算。 (这与其他答案中的预备建议类似。)对于图像处理,颜色映射计算(调色板,本机 - > RGB转换等)是频繁的操作,可以通过用预先计算的查找表替换API调用来轻松优化。

如果您自己进行大多数计算/图像数据操作,您必须自己优化代码,其中包括使用“配置文件”中的建议。回答,或者,我建议,发布一些代码。

没有人可以诊断只有简要描述的有缺陷的机器。即使没有录制操作声音,也没有特定发动机细节的图片,所有机械师都可以说是“真的,有问题,但更多我不能说”如果你只是告诉他“它没有以预期的速度运行”

答案 2 :(得分:2)

将处理移动到单独的工作线程中。让一个线程从网络摄像头读取图像并将它们推入某个队列进行处理。让另一个线程(或线程池)处理队列。完成后,将最终结果发布到主线程以供显示。

答案 3 :(得分:1)

没有提升计时器“性能”的东西。计时器可以做到这一点,非常好,就是这样。

只能得出一个结论:您的代码需要300毫秒才能完成。配置文件和重构优化您的代码,或将计时器间隔设置为更大的值。