【发布时间】:2017-07-22 15:43:42
【问题描述】:
我一直在制作一款安卓游戏,我注意到它在 Nougat 上的运行速度是 Marshmallow 上的两倍多。事实上,我发现在我的代码中的任意两点之间,时间的增加似乎大致相同。
所以我做了一个测试应用程序,当按下后退按钮时,它会进行测试,但我再次得到大致相同的结果(代码如下)。我使用两个 android 虚拟设备对此进行了测试(请参阅记录的平均时间(以毫秒为单位)的代码),但我最初注意到它是因为我的平板电脑已更新为牛轧糖,因此它不是 AVD 特定的。
我不知道是什么原因造成的。我的一些想法如下:
- 编译器未针对牛轧糖进行优化(最小 API 为 15,目标为 25,我正在使用 sdk 工具 25.0.2 构建)。对我来说似乎不太可能,因为这将是一个非常普遍的问题,谷歌会立即解决。
- 操作系统正在使用更多资源,因此我的游戏剩余的资源更少。不太可能,因为这不应该导致 2 倍的速度下降。
- 操作系统添加了一个较小的 CPU 使用限制。也许我必须要求获得高优先级或类似的东西,但我希望有清晰的文档,所以也不太可能。
- Android Studio 的设置对我来说不是最佳的。这对我来说似乎最有可能,但我找不到任何对我有帮助的东西。
感谢任何见解或复制品!谢谢。
主活动
package com.example.nickgkg.test;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.TextView;
public class MainActivity extends AppCompatActivity{
TextView text;
long time = 0;
@Override
protected void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
text = (TextView)this.findViewById(R.id.text);
}
@Override
public void onBackPressed(){
//API 24(nougat) vs API 23(marshmallow)
//API 25 performs the same as API 24 so I didn't include it
long t=System.nanoTime();
if(false){//Toggle this to change the test
float garbage;
for(int i=0;i<100000000;i++)
garbage=i*27/2200f;
//API 24:710ms vs API 23:620ms
}else{
for(int i=0;i<1000000;i++)
something();
//API 24:320ms vs API 23:120ms
}
time=System.nanoTime() - t;
text.setText(time/1000000f+"ms");
}
private void something(){
//BLANK function call
}
}
activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/activity_main"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="com.example.nickgkg.test.MainActivity">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Hello World!"
android:id="@+id/text"/>
</RelativeLayout>
【问题讨论】:
-
在不同的 23 设备上,您会看到相同的传播时间。取决于 CPU。
-
你的测试,如果报告的数字是正确的,证明每个方法调用有 200 纳秒的额外开销(200 毫秒 / 1000000)。这不应该导致“速度降低 2 倍”,除非您有很多微小的方法调用(例如,每个方法调用的平均内部计算时间为 200 纳秒)。
-
@greenapps 我正在使用具有完全相同规格的 23 和 24 的 android 虚拟设备,所以没有什么是特定于设备的
-
@CommonsWare 调用只是速度较慢的一个例子。例如,算术运算也较慢(620 vs 710),而且我确信其他东西也较慢,因为否则我怎么会降低 2 倍的速度。我不想测试每种类型的代码,所以我认为只显示两个是一个好的开始
-
“算术运算也更慢,例如(620 vs 710)”——每对浮点运算的速度为 90 飞秒。 “否则我怎么能将速度降低 2 倍”——在实际应用中使用方法跟踪,并确定您在实际应用中花费时间的位置。
标签: java android performance android-6.0-marshmallow android-7.0-nougat