DSAppTeam / Anchors

:white_check_mark: Anchors 是一个基于图结构,支持同异步依赖任务初始化 Android 启动框架。其锚点提供 "勾住" 依赖的功能,能灵活解决初始化过程中复杂的同步问题。参考 alpha 并改进其部分细节, 更贴合 Android 启动的场景, 同时支持优化依赖初始化流程, 自动选择较优的路径进行初始化。
Apache License 2.0
820 stars 79 forks source link

任务额外耗时问题 #32

Closed dingdangmao123 closed 3 years ago

dingdangmao123 commented 3 years ago

我发现执行一个Task的时候,整个执行流程会比Task本身多花费几十到100多ms, 这对于总共也就耗时不到1s的若干Task,速度提升不明显,请问是什么原因导致,能避免吗?

YummyLau commented 3 years ago

@dingdangmao123 整个过程有日志记录每个task等待,执行,结束的时间,贴下log。另外,另外,怎么有效构建完全看业务怎么拆分,库只是一种工具的。最好能表述下你的场景。

dingdangmao123 commented 3 years ago

@YummyLau

   var t1 = object: Task("t1", true) {
        override fun run(name: String) {
            Thread.sleep(500)
            Log.i("Tag",name+" "+ (System.currentTimeMillis()-start))
        }
    }

    val map = mapOf<String, Task>("t1" to t1)
    val project = Project.Builder("App", Project.TaskFactory(object : TaskCreator {
        override fun createTask(taskName: String): Task {
            return map[taskName] ?: error("")
        }
    })).add("t1").build()
    AnchorsManager.getInstance()
            .debuggable(true)
            .addAnchor("t1")
            .start(project)

2021-05-07 15:54:08.644 24397-24424/com.example.myapplication I/Tag: t1 563 2021-05-07 15:54:08.676 24397-24397/com.example.myapplication I/Tag: app end 595 2021-05-07 15:54:08.820 24397-24430/com.example.myapplication I/Tag: MainActivity

只添加了一个任务

YummyLau commented 3 years ago

贴一下库内部的log,过滤tag就可以拿到,有完整的信息。另外,单个task不需要用project。

dingdangmao123 commented 3 years ago

2021-05-07 15:54:08.093 24397-24397/com.example.myapplication D/Anchors: App_start(1620374048088) -- onStart -- 2021-05-07 15:54:08.107 24397-24397/com.example.myapplication D/Anchors: App_start(1620374048088) -- onRunning -- 2021-05-07 15:54:08.107 24397-24397/com.example.myapplication D/Anchors: App_start(1620374048088) -- onFinish -- 2021-05-07 15:54:08.115 24397-24397/com.example.myapplication D/Anchors: t1 -- onStart -- 2021-05-07 15:54:08.116 24397-24424/com.example.myapplication D/Anchors: t1 -- onRunning -- 2021-05-07 15:54:08.117 24397-24397/com.example.myapplication D/Anchors: App_start(1620374048088) -- onRelease -- 2021-05-07 15:54:08.645 24397-24424/com.example.myapplication D/Anchors: t1 -- onFinish -- 2021-05-07 15:54:08.651 24397-24424/com.example.myapplication D/TASK_DETAIL: TASK_DETAIL

======================= task (t1 ) =======================
| 依赖任务 : App_start(1620374048088)  
| 是否是锚点任务 : true 
| 线程信息 : Anchors Thread #1 
| 开始时刻 : 1620374048115 ms
| 等待运行耗时 : 1 ms
| 运行任务耗时 : 528 ms
| 结束时刻 : 1620374048644 
==============================================

2021-05-07 15:54:08.651 24397-24424/com.example.myapplication D/ANCHOR_DETAIL: TASK_DETAIL

======================= task (t1 ) =======================
| 依赖任务 : App_start(1620374048088)  
| 是否是锚点任务 : true 
| 线程信息 : Anchors Thread #1 
| 开始时刻 : 1620374048115 ms
| 等待运行耗时 : 1 ms
| 运行任务耗时 : 528 ms
| 结束时刻 : 1620374048644 
==============================================

2021-05-07 15:54:08.651 24397-24424/com.example.myapplication D/Anchors: App_end(1620374048088) -- onStart -- 2021-05-07 15:54:08.651 24397-24424/com.example.myapplication D/Anchors: t1 -- onRelease -- 2021-05-07 15:54:09.023 24397-24397/com.example.myapplication D/Anchors: App_end(1620374048088) -- onRunning -- 2021-05-07 15:54:09.024 24397-24397/com.example.myapplication D/Anchors: App_end(1620374048088) -- onFinish -- 2021-05-07 15:54:09.027 24397-24397/com.example.myapplication D/Anchors: App_end(1620374048088) -- onRelease --

dingdangmao123 commented 3 years ago

另外想请教一个问题 如果Task之间耗时差别比较大 如何构建 整体比较省时 @YummyLau

YummyLau commented 3 years ago

528ms是正常的,sleep到唤醒到打点。其实要先整理好项目的task哪些是必须阻塞同步完成,哪些可以延后主线程同步,哪些可以异步,然后再排好序执行就行了。框架内部用的是线程调度,不会过多损耗,有的都是系统的线程调度切换。具体来说还是看项目需求。另外,anchor是会同步阻塞调用的,你的demo在异步sleep之后才完成且主线程要同步等待,这些都是系统损耗。