关于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
    }

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

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


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


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

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

我想S7可能有一个Snapdragon 820