Help us understand the problem. What is going on with this article?

LocalDateクラスで月末を取得する方法の速さ比較

More than 3 years have passed since last update.

LocalDateクラスを使って月末を取得する方法について速さを比較してみました。

実行環境は以下の通りです。

  • DELL VOSTRO 1540
  • Windows 10 Pro 32bit
  • Intel Celelron 2.00 GHZ
  • メモリ 2.0GB
  • HDは約300GB

月末を取得するは以下です。

  • rangeメソッドを使用して、月の日について最大を求める。
  • 翌日初日-1を設定して月の日を求める。
  • LocalDate#lengthOfMonthを使う。(@rinp さんにコメントをいただきましたので追加。)

ソースと実行結果

上記をそれぞれ30000回実行して時間を比較しました。以下、ソースと結果です。

ソース
package test;

import java.time.LocalDate;
import java.time.Month;
import java.time.temporal.ChronoField;
import java.util.function.LongSupplier;

public class Test {

    // --計測用--
    private void printProcessingTime(LongSupplier f) {
        int count = 30000;
        long start, end;
        start = System.currentTimeMillis();
        for (int i = 0; i < count; i++) {
            f.getAsLong();
        }
        end = System.currentTimeMillis();
        System.out.printf("出力確認:%s, 計測 %3d: ", f.getAsLong(), end - start);
        System.out.println();
    }

    // --計測--
    public static void main(String[] args) {
        new Test().test();
    }

    private void test() {
        System.out.println("rangeメソッドを使用して、月の日について最大を求める。");
        printProcessingTime(() -> {
            return LocalDate.of(2016, Month.FEBRUARY.getValue(), 1).range(ChronoField.DAY_OF_MONTH).getMaximum();
        });

        System.out.println("翌日初日-1を設定して月の日を求める。");
        printProcessingTime(() -> {
            return LocalDate.of(2016, Month.MARCH.getValue(), 1).minusDays(1L).getDayOfMonth();
        });
        System.out.println("LocalDate#lengthOfMonthを使う。");
        printProcessingTime(() -> {
            return LocalDate.of(2016, Month.FEBRUARY.getValue(), 1).lengthOfMonth();
        });
    }
}

以下、実行結果です。

結果
rangeメソッドを使用して、月の日について最大を求める。
出力確認:29, 計測  86: 
翌日初日-1を設定して月の日を求める。
出力確認:29, 計測  26: 
LocalDate#lengthOfMonthを使う。
出力確認:29, 計測   2: 

LocalDate#lengthOfMonthが一番速いです。

修正履歴

20161009

  • 文言修正。
  • 月末取得方法に@rinp さんに教えていただいた方法を追加。
  • ソースを修正し、java.util.functionを使用。
  • 出力結果も再実施。
java-beginner
ハンドルネーム「Javaを復習する初心者」です。
http://java-beginner.com/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした