脚本运行太慢?一个 5 分钟才能完成的自动化任务,优化后 30 秒搞定。本文从 Delay 精确调优、循环优化、命令选择(FindColor vs FindPic 性能对比)、批量操作和缓存策略 5 个方向切入,附优化前后耗时对比数据。
Delay 是决定脚本速度的第一变量。优化原则:操作间 Delay = 目标程序响应时间 + 安全余量。例如,Excel 切换单元格后约 50ms 即可响应,那 Delay 设为 100ms 足够,不需要默认的 1000ms。
优化前:每个操作间 Delay 1000ms → 100 次操作 = 100 秒
优化后:Delay 100ms → 100 次操作 = 10 秒 → 提速 10 倍
把不变的计算移出循环体。例如:
优化前:For i = 1 To 1000 : x = GetPixelColor(500,300) : If x = "FFFFFF" Then ... : Next(每次循环都取色,耗时约 50ms×1000 = 50 秒)
优化后:如果目标颜色只有两种可能,只判断一次:x = GetPixelColor(500,300) : If x = "FFFFFF" Then : For i = 1 To 1000 : ... : Next(取色只执行一次,1 秒内完成)
FindColor(约 10-50ms):适合少量像素搜索,速度最快。
FindPic(约 50-200ms):适合复杂图标匹配,但速度慢。
原则:能用 FindColor 就不用 FindPic;如果必须用 FindPic,尽量缩小搜索区域(不要全屏搜索,限定在目标窗口内)。
当需要向同一个程序发送连续按键时,一次性组合发送比逐条发送快:
优化前:KeyPress "A" : Delay 100 : KeyPress "B" : Delay 100(200ms)
优化后:SayString "AB"(1ms)
对于不频繁变化的数据(如窗口句柄、颜色值),获取一次后保存到变量,后续直接引用,避免重复调用 API。Dim hwnd : hwnd = FindWindow("记事本") // 获取一次
If hwnd <> 0 Then : SetForegroundWindow hwnd : ... : End If // 后续引用变量
第一步:减少 Delay 值(从 1000ms 降到 100-200ms 试,比人类输入速度快很多其实不会出错)。第二步:检查是否有不必要的全屏搜索(FindPic 限定区域)。第三步:把循环外的不变计算和变量初始化移出循环体。
在相同分辨率(1920×1080)下全屏搜索,FindColor 约 10-50ms,FindPic 约 50-200ms。差距在 5-20 倍之间。如果脚本中有大量 FindPic 调用,优先考虑能否替换为 FindColor。
最常见瓶颈:1) Delay 值过大(占 80% 的慢速原因);2) 全屏 FindPic 搜索(每次 100-200ms);3) 循环内重复计算;4) 不必要的外部文件读写操作。按本文技巧 1→3→2 顺序排查即可。