2011-12-15 3 views
0

これを行うには、より効率的な方法がある場合、私は、CPU時間の観点から、思ったんだけど:フォーマットされた文字列を取得する効率的な方法は、Period/PeriodFormatよりもありますか?

/* 
* Returns a string in the form of "n days, x hours, y minutes" 
* */ 

public static String getFormattedDateDifference(DateTime startDate, DateTime endDate) { 
    Period p = new Period(startDate, endDate, 
      PeriodType.standard().withSecondsRemoved().withMillisRemoved()); 
    return PeriodFormat.getDefault().print(p); 
} 
+0

ミリ秒単位でタイムスタンプを取得して操作するだけでなく、 – fge

+0

どうしたのか気にしない。より安価なもの。私は頻繁にこのメソッドを呼び出す必要があり、そのCPUの豚! – LuxuryMode

+1

もちろん、Javaのカレンダーとスイングの日付形式。 – Stephan

答えて

0

これ、多分?本来の機能のための

public static void main(final String... args) 
{ 
    final DateTime d = DateTime.now(); 

    final DateTime d2 = d.minus(Days.days(1)).minus(Minutes.minutes(3)); 

    long start, end; 

    final int count = 5000; 
    int i; 

    start = System.currentTimeMillis(); 
    for (i = 0; i < count; i++) 
     getFormattedDateDifference(d2, d); // <-- the original implementation 
    end = System.currentTimeMillis(); 

    System.out.println(end - start); 

    start = System.currentTimeMillis(); 
    for (i = 0; i < count; i++) 
     getFormattedDateDifference2(d2, d); // <-- the implementation above 
    end = System.currentTimeMillis(); 

    System.out.println(end - start); 

    System.exit(0); 
} 

383ミリ、鉱山のための150ミリ秒:この単純なmain()

private static final Pattern PATTERN = Pattern.compile(", $"); 

public static String getFormattedDateDifference(final DateTime startDate, 
    final DateTime endDate) 
{ 
    // This variable will ultimately contain the number of days 
    long days = endDate.getMillis() - startDate.getMillis(); 

    final long hours, minutes; 

    days /= 60000; // Forget seconds and milliseconds 

    minutes = days % 60; days /= 60; 

    hours = days % 24; days /= 24; 

    final StringBuilder sb = new StringBuilder(); 

    if (days != 0) { 
     sb.append(days).append(" day"); 
     if (days > 1) 
      sb.append('s'); 
     sb.append(", "); 
    } 
    if (hours != 0) { 
     sb.append(hours).append(" hour"); 
     if (hours > 1) 
      sb.append('s'); 
     sb.append(", "); 
    } 
    if (minutes != 0) { 
     sb.append(minutes).append(" minute"); 
     if (minutes > 1) 
      sb.append('s'); 
     sb.append(", "); 
    } 

    return PATTERN.matcher(sb.toString()).replaceFirst(""); 
} 

は、それが倍以上高速化を示しています。

+0

これはCPU時間を半分以上削減することができます。 – LuxuryMode

関連する問題