java - 绩效十亿计数器

标签 java android performance

最近我开发了一个十亿计数器应用程序来测量手机的性能。

我使用以下代码来测量十亿的计数。

Start.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            t1 = System.currentTimeMillis();
            count = 1000000000;
            while (count != 0){
                --count;
            }

            t2 = System.currentTimeMillis();
            tf = (t2-t1)/1000;

            CountDisp.setText(""+tf);
        }
    });

使用此代码,我的手机花了(大约)75 秒数到十亿。

但是当我测量从 Google Play 商店下载的另一个应用程序的时间时,我的手机花了 37 秒才数到 10 亿。

如何使我的代码尽可能快?

或者还有其他方法吗?

注意:- 两个应用程序数到一百万所需的时间相同,(大约)0.110 秒

最佳答案

更快:

int count=1000000000;
while (count--!=0)
    ;

请注意,这对循环使用了不同的结构(仅读取一次 count),并且它使用局部变量而不是实例字段。使用局部变量速度更快,因为它驻留在堆栈上的已知位置,并且 JVM 只需要一次操作即可检索它,而对于实例字段,JVM 需要查找 this 实例,然后加载到右侧字段中。对于大多数目的来说,这个额外的步骤所带来的差异是完全微不足道的,但你的循环是如此紧密(即,内容自由),以至于这个额外的步骤非常重要。

你甚至可以做得更好

long count=1000000000L;

因为这很可能是 64 位 JVM。

(就其他应用程序而言,它可能正在使用 JNI( native 代码),在这种情况下,您所做的任何操作都不会竞争。但我对此表示怀疑。)

关于java - 绩效十亿计数器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26220437/

相关文章:

java - Android:未调用 MainActivity 中的 onResume

Android 应用程序在使用 b 的 LinearLayout View 启动时崩溃

android - BottomSheet查看Android

Java如何使用double或string?

java - SetBackgroundResource() 延迟?

javascript - Ionic App 在移动浏览器中运行流畅

php - 什么更有效,为什么 : one db connection per page or one db connection per function?

sql - SELECT .. WHERE NOT IN (SELECT ..) with strings 的性能急剧下降

java - 查询异常 : JPA-style positional param was not an integral ordinal

java - android类构造函数中的最佳实践