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

性能测试疑问 #48

Open
an87li opened this issue Sep 16, 2019 · 10 comments
Open

性能测试疑问 #48

an87li opened this issue Sep 16, 2019 · 10 comments

Comments

@an87li
Copy link

an87li commented Sep 16, 2019

您好,我在app demo的基础上修改了 layout 下面的 activity_main_inter.xml 文件,把它替换成一个比较复杂的 XML 文件进行测试;在 ActivityX2C 文件的 X2C.setContentView 前后打印时间,并在 ActivityXML 文件的 setContentView 前后打印时间,然后比较两个时间,发现 X2C 方式的时间反而比 XML 方式的时间要多。我是在Android Studio debug模式下测试的。
请问您能分享一下你们测试X2C性能的Case 或者测试方法,感谢~~

@an87li
Copy link
Author

an87li commented Sep 16, 2019

@chengweidev

@jimor1234567
Copy link
Contributor

系统Activity XML解析是一个io操作,它需要从存储卡上的apk中提取XML文件到内存中并显式进行反射调用,此时影响该操作的时间的主要因素有,提取xml文件的大小,反射的性能,存储卡上apk文件的解压速度即apk大小、内容复杂度。在demo中由于原apk比较简单,大小较小,反射性能也较好,所以其性能提升并不明显。如果要完整的测试性能,需要在真实的项目中进行测试。我们的测试测试结果是基于实际项目进行的。

@chenzhu33
Copy link

在一些低端机真实项目上测试下来,性能几乎没有提升,xml加载耗时50-80ms浮动,x2c加载耗时50-70浮动,能给一个你们的测试xml试试吗?

@jimor1234567

@huanggenghg
Copy link

我在项目中添加,测试,加载耗时也没有增加很多,有的机型甚至更为耗时。这个 200% 缺少一些数据支撑。

@hanschencoder
Copy link

hanschencoder commented Nov 14, 2019

    List<Object> list = new ArrayList<>();
    current = System.currentTimeMillis();
    for (int i = 0; i < 50000; i++) {
        list.add(new TextView(this));
    }
    Log.d("Hans", "new:" + (System.currentTimeMillis() - current));
    list.clear();

    try {
        Class<?> textViewClass = Class.forName("android.widget.TextView");
        Constructor constructor = textViewClass.getConstructor(Context.class);
        current = System.currentTimeMillis();
        for (int i = 0; i < 50000; i++) {
            list.add(constructor.newInstance(this));
        }
        Log.d("Hans", "newInstance:" + (System.currentTimeMillis() - current));
        list.clear();
    } catch (Exception ignored) {
    }
D/Hans: new:6958
D/Hans: newInstance:6604

实际测试中,貌似 newInstance 的性能比直接 new 性能更好?

@JesseWo
Copy link

JesseWo commented Dec 1, 2019

没有冒犯的意思。只是在想如果对性能提升很有效,Google为什么不去做这件事~

@furutuki
Copy link
Contributor

没有冒犯的意思。只是在想如果对性能提升很有效,Google为什么不去做这件事~

Google没有做或者没有及时做的事情多了。android最开始没有MultiDex的时候,不是大家各显神通去分包、插件化的吗。

这个问题写个简单的布局和测试代码验证一下即可。测试的效果和布局复杂度以及加载的测试的加载次数有关,我个人做了一组测试,不到10个节点加载100次,inflate的时间大概是代码的的2倍。次数放大到1000,差距更大。

@james0912
Copy link

没有冒犯的意思。只是在想如果对性能提升很有效,Google为什么不去做这件事~

Google有意识到这个问题。
Android 10里在LayoutInflater.java里新增了tryInflatePrecompiled方法,不过当前Release还是Not supported状态……

@jimor1234567
Copy link
Contributor

google实际已经意识到xml解析布局对性能的影响,所以已经做了一些优化,比如xml文件预加载到内存,xml反射类时会缓存View的构造函数。比较new和newInstance的性能对讨论X2C没有意义。

@ymqq
Copy link

ymqq commented Jun 3, 2021

其实时间不在new 或者 newInstance上,耗时主要在加载xml->解析,这个步骤耗时,耗性能。

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

9 participants