关于Android:简单循环在执行时间上的巨大差异:为什么?

VAST difference in execution time for simple loop: How come?

我注意到,在两个相似但不同的设备(即三星Galaxy S4和S7)上,即使是一个简单的循环,其执行时间也存在巨大差异。在S7上,下面的测试需要约5毫秒,在S4~250毫秒上,相差50倍。我确定S7比S4快,但是50倍????

我尝试过Android分析器(CPU、内存),但没有看到任何危险信号。S7应用程序在大约10%的CPU和大约25%的S4下烹饪。

下面的代码是我实际应用程序的一个非常简单的摘录。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
    //@ Test Timing
    public static void timingTest()
    {
        int i,count=0;
        long t1,t2;
        String TAG="MYAPP";

        t1 = System.currentTimeMillis();
        for( i=0; i<4000000; i++ ) {        // get start time
            count++;                        // just bump count
        }
        t2 = System.currentTimeMillis();    // get stop time

        String msg=String.format("ELAPSED = %8.3f sec.", 0.001*(t2-t1) );
        Log.i( TAG, msg );                  // announce elapsed time
    }

我认为这可能是优化方面的差异,但它没有相关性不同的是,如果我把真实(不可优化)的处理放在循环中。调试和发布版本之间也没有任何区别。

我已经打败这个一个星期了,没有更多的洞察力。有人知道这件事吗?还是我运气不好?

  • 这两部手机上的操作系统是什么?你能确认这两部手机是用艺术版的还是用Dalvik的?
  • S4是安卓v5.01,S7是v8.0。因为我的基准测试中没有操作系统交互,所以我不知道版本会有什么不同。
  • 两个都是达尔维克,艺术不会在S4上运行。


结果发现那只是个坏电话。多么尴尬啊。我借用了一个朋友的S3,我的基准测试显示性能降低了50%(约10毫秒),我认为这是对更老手机的正常预期。奇怪的是,我的S4工作得很好——只是速度很慢。孩子,那是我浪费了一个星期的时间,我再也回不来了。


实际上,它是一个Exynos 5Snapdragon 820Exynos 8CPU。API级别在这里也起着一定的作用;核心的数量以及其中有多少被并行使用。就在昨天,我们看到了一个问答,它比较了CJavaARMx86的看法。或者,S4上的操作系统可能是用错误的标志编译的;不是完全错误的,但并不像S7操作系统那样优化。

你也可以用安图图作为他们的基准,分数大约是五分之一。

我想S7可能有一个Snapdragon 820

  • 谢谢你的迅速回复。我还没有检查过CPU的型号,但是在谷歌上,我发现差异小于2倍的系数,而不是我看到的50倍。就优化而言,这两个设备都是使用全新构建的应用程序和相同的项目设置进行测试的,所以除非有一些微妙的问题,我不相信这就是原因。顺便说一句,S4有一个1.9GHz的CPU,而S7是2.3GHz,同样,没有什么区别。