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
相关产品推荐
相关产品推荐

