どちらが速い?! 整数リソース取得における Integer.parseInt(R.string.hoge) と R.integer.hoge

  • このエントリーをはてなブックマークに追加
  • Pocket

整数リソースを保存しておくのには、R.integerを使うべきでしょうか。それとも文字列として、R.stringを使用して保存しておくべきでしょうか。整数リソースを取得した場合のパフォーマンスを測定してみましたので紹介します。

環境

  • Xperia Z5 compact
  • Android 6.0.1
  • Android SDK Build-tools 24.0.3

まとめ

整数リソースの取得は、 R.integer.hoge から取得するほうが、R.string.hogeから取得してIntegerにキャストするよりも2倍速い。キャストし忘れを防ぐ意味でも、R.integer.hogeのほうが良さそう。

測定方法

次のことを100000回行うのにかかった時間をSystem.nanoTime()で計測。どちらも、取得した値は int に代入。なお、Integer に代入しても、有意な差はなかった。

  • R.integer.hogeの整数値をgetResources().getInteger(R.integer.hoge)で、取得する。
  • R.string.hogeの文字列を、Integer.parseInt(getString(R.string.hoge))で、取得して整数に変換。

結果

  • R.integer.hoge : 697 ms
  • R.string.hoge : 1333 ms

ソース

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <integer name="one">1</integer>

</resources>
<resources>
    <string name="app_name">My Application</string>
    <string name="one">1</string>
</resources>
<?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.android.myapplication.MainActivity">

    <TextView
        android:id="@+id/MyTextView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Hello World!" />
</RelativeLayout>
package com.example.android.myapplication;

import android.app.Activity;
import android.os.Bundle;
import android.widget.TextView;

public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

    }
    protected void onResume(){
        super.onResume();
        int N = 100000;

        int tmp;
        long st = System.nanoTime();

        for(int i = 0; i < N; i++) {
            tmp = getResources().getInteger(R.integer.one);
        }
        long e1 = System.nanoTime();


        for(int i = 0; i < N; i++) {
            tmp = Integer.parseInt(getString(R.string.one));

        }
        long e2 = System.nanoTime();

        TextView view = (TextView) findViewById(R.id.MyTextView);
        view.setText("getInteger : " + (e1-st)/1000/1000 + "msngetString  : " + (e2-st)/1000/1000 + "msn");
    }

}
  • このエントリーをはてなブックマークに追加
  • Pocket

コメントを残す