Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

PreLoader.get里面调用add(xml)会不会造成性能的浪费呢? #12

Closed
yuanyang1991 opened this issue Nov 7, 2017 · 2 comments
Closed

Comments

@yuanyang1991
Copy link

看代码发现,在PreLoader.get方法得到oldCenter之后会调用add(xml)方法放入缓存中,但是add方法内部又初始化了一个newCenter,newCenter和oldCenrer应该是同一个RapidObject(解析的是一份xml),为什么不直接把oldCenter缓存起来,还要解析一遍生成newCenter呢?这样会不会造成性能浪费?还是我理解错了?

@Earlonus
Copy link
Collaborator

Earlonus commented Nov 7, 2017

感谢你的问题,仅以讨论的角度来解释一下当时这样设计的想法:
RapidObject的initialize本质上是生成了一个IRapidView,这个对象经过了初始化,但未经load,是一个可复用的状态,但是一旦经过load就变成了一个唯一的界面对象,不再可以复用。也就意味着,如果要完美复用的话,需要对IRapidView的initialize后的状态进行对象深度拷贝。在initialize的时候会生成许多其它关联对象,这些关联对象也要进行深度拷贝。需要维护一份比较复杂的拷贝函数,随着项目的演进,这份列表需要同步维护,如果其它人介入项目忘记维护这个列表,有可能导致整个框架异常。

在我理解来看,工程的复杂度和性能在项某一个点总是会出现取舍。在这个点上,XML本身是有内存缓存的情况下,我倾向于认为重新initialize一份对象的代价会小于维护一份克隆函数以及可能出现的问题。所以在这个地方简单处理成缓存一份一次性对象,取走了再缓存一份。

@yuanyang1991
Copy link
Author

懂了,感谢回复

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants