You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ppadb异步API同步调用比同步API慢10倍的原因探究

为何ppadb中逐个await异步screencap比同步API慢10倍?

在使用ppadb获取手机截图时发现异常:逐个await异步API device.screencap() 的实现,比直接使用同步API慢10倍。虽然预期异步会有少量性能开销,但单操作慢2秒的差距过于夸张,结合测试代码与输出分析如下:

测试代码

import asyncio, subprocess, time
from ppadb.client_async import ClientAsync
from ppadb.client import Client

def startServer():
    subprocess.run("adb start-server", stderr=subprocess.PIPE)
startServer()

async def doScreen(device, i):
    await device.screencap()
    print(i, " ", sep="", end="")

async def main():
    adb = (Client(host="localhost", port=5037), ClientAsync(host="localhost", port=5037))
    device = (adb[0].devices()[0], (await adb[1].devices())[0])
    
    n = 30
    
    start = time.time()
    for i in range(n):
        device[0].screencap()
        print(i, " ", sep="", end="")
    print("\nsynchronous ", (time.time() - start)/n, "\n", sep="")
    
    start = time.time()
    for i in range(n):
        await device[1].screencap()
        print(i, " ", sep="", end="")
    print("\nsynchronous using await ", (time.time() - start)/n, "\n", sep="")
    
    start = time.time()
    async with asyncio.TaskGroup() as tg:
        for i in range(n):
            tg.create_task(doScreen(device[1], i))
    print("\nasynchronous and parallel ", (time.time() - start)/n, "\n", sep="")
asyncio.run(main())

测试输出

0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 
synchronous 0.22747948964436848

0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 
synchronous using await 2.2235145966211953

0 7 11 5 10 16 26 29 1 15 9 28 12 17 14 2 19 13 6 21 4 22 18 8 3 25 23 20 27 24 
asynchronous and parallel 0.16928408145904542

核心原因:连接复用策略差异

ppadb的同步与异步客户端在ADB连接复用逻辑上的差异,是导致性能差距的关键:

  • 同步客户端(Client):获取的Device对象会维持一个长期有效的ADB连接,所有screencap调用直接复用该连接,仅需传输截图数据,完全避免了TCP握手、ADB认证等连接建立的额外开销。
  • 异步客户端(ClientAsync):逐个await调用screencap时,每次调用都会新建临时ADB连接,完成截图后立即关闭。单次连接建立的开销约2秒,被叠加到每个操作中,直接导致单操作耗时暴涨10倍。

并行测试的佐证

从并行异步测试结果(平均0.16秒/操作)可以看出:异步客户端本身性能并不差,当多个异步任务并发执行时,客户端可复用连接或批量处理请求,分摊了连接建立的开销,最终性能甚至超过同步版本。

优化建议

如果需要使用异步API且保持单操作性能,建议:

  • 改用批量异步任务(如asyncio.TaskGroup)的方式执行,通过并发复用资源减少连接开销;
  • 检查ppadb异步客户端实现,尝试手动复用连接以避免重复建立连接的损耗。

内容的提问来源于stack exchange,提问作者Tellegar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 06:35:16