2014-09-05 1 views
0

Je construis une méthode Java pour additionner deux périodes de temps, en utilisant la librairie JodaTime. Mon code fonctionne bien, mais je pense qu'il est possible d'optimiser pour réduire l'exécution du temps ... Malheureusement, je suis nouveau sur JodaTime.Comment puis-je optimiser ce code? (JodaTime requis)

Ceci est mon code:

import org.joda.time.Period; 
import org.joda.time.PeriodType; 
import org.joda.time.format.PeriodFormatter; 
import org.joda.time.format.PeriodFormatterBuilder; 


public class Test { 

    public static void main(String[] args) 
    { 
     String time1 = "08:00"; 
     String time2 = "08:00"; 

     System.out.println(Operation_Sum(time1,time2)); 
    } 

    private static String Operation_Sum(String time1, String time2) 
    { 
     String output; 
     long start = System.currentTimeMillis(); 

     if (time1.equals("00:00") && time2.equals("00:00")) 
     { 
      output = "00:00"; 
     } 
     else if (time1.equals("00:00")) 
     { 
      output = time2; 
     } 
     else if (time2.equals("00:00")) 
     { 
      output = time1; 
     } 
     else 
     { 
      boolean sign_time1 = false; 
      boolean sign_time2 = false; 
      String[] time1_out, time2_out; 

      boolean negative = false; 
      String output_split[]; 

      if (time1.contains("-")) 
      { 
       time1_out = time1.split(":"); 
       time1_out[0] = time1_out[0].replace("-", ""); 
       time1_out[1] = time1_out[1].replace("-", ""); 
       time1 = time1_out[0] + ':' + time1_out[1]; 
       sign_time1 = true; 
      } 

      if (time2.contains("-")) 
      { 
       time2_out = time2.split(":"); 
       time2_out[0] = time2_out[0].replace("-", ""); 
       time2_out[1] = time2_out[1].replace("-", ""); 
       time2 = time2_out[0] + ':' + time2_out[1]; 
       sign_time2 = true; 
      } 

      PeriodFormatterBuilder builder = new PeriodFormatterBuilder(); 
      builder.minimumPrintedDigits(2); 
      builder.printZeroAlways(); 
      builder.appendHours(); 
      builder.appendLiteral(":"); 
      builder.appendMinutes(); 
      PeriodFormatter pf = builder.toFormatter(); 

      Period period1 = pf.parsePeriod(time1); 
      Period period2 = pf.parsePeriod(time2); 
      Period normalized; 
      Period total = null; 


      if (sign_time1 && sign_time2) 
      { 
       total = period1.plus(period2); 
       negative = true; 
      } 

      if (sign_time1 && !sign_time2) 
      { 
       total = period2.minus(period1); 
      } 

      if (!sign_time1 && sign_time2) 
      { 
       total = period1.minus(period2); 
      } 

      if (!sign_time1 && !sign_time2) 
      { 
       total = period1.plus(period2); 
       negative = false; 
      } 

      normalized = total.normalizedStandard(PeriodType.time()); 
      output_split = pf.print(normalized).split(":"); 

      if (output_split[1].contains("-")) 
      { 
       output = output_split[0] + ":" + output_split[1].replace("-", ""); 
      } 
      else 
      { 
       output = (negative ? "-" : "") + output_split[0] + ":" + output_split[1]; 
      } 
     } 

     long end = System.currentTimeMillis(); 

     System.out.println("exec time sum1: " +(end - start) + " ms"); 
     return output; 
    } 
} 

Merci !! :)

+5

Cette question semble mieux convenir à [Code Review] (http://codereview.stackexchange.com/). Bien que je suggère de réduire les exigences d'optimisation. – Mena

+2

Si vous voulez additionner deux périodes, pourquoi utilisez-vous des chaînes? Pourquoi n'utilisez-vous pas la classe 'Period' de Joda Time pour * tout *? L'entrée de votre méthode 'sum' devrait être deux périodes, IMO. (Ou deux durées possibles - on ne sait pas quelle est votre situation réelle.) Vous pouvez alors séparer l'analyse de période/durée. –

+0

merci pour votre soutien! de toute façon, j'utilise deux chaînes car l'entrée provient d'une base de données ... et les données sont stockées telles quelles. – user3449772

Répondre

2

Le code a vraiment besoin d'un CR.

Si vous voulez le rendre plus rapide, rendez-le d'abord plus court. Le genre JVM refuse d'optimiser les méthodes trop longues. En ce qui concerne l'optimisation, il semble que vous perdiez le plus de temps avec les chaînes de caractères. Quoi qu'il en soit, le nettoyage du code, puis le profilage, puis optimisation est l'ordre approprié.

De votre programme n'est pas exactement clair ce que vous faites, cependant, il ne peut pas être vraiment juste. Faire

time1_out[0] = time1_out[0].replace("-", ""); 

signifie que vous transformez par exemple, --12:--34--- en 12:34. Est-ce que c'est prévu? Si non, où est autorisé le tableau de bord? Si seulement à la première position comme -12:34, alors time1_out.substring(1) est sûrement plus propre et plus rapide. Et ainsi de suite ...

J'utilise deux chaînes parce que l'entrée provient d'une base de données

Y at-il une base de données qui ne peut pas stocker des dates ou des numéros? Si 12:34 signifie environ douze heures et demie, alors enregistrez-le comme DATE. Si cela signifie 12 heures et 34 minutes ou 12 minutes et 34 secondes, alors stockez-le comme INTEGER. Ne jamais manipuler les chaînes s'il y a un meilleur type de données.

+0

merci pour la réponse! le replace ("-", "") est utilisé pour gérer les heures négatives. En fait, par exemple, si j'ai la première entrée égale à "-8: 00" et la deuxième entrée égale à "-8: 00", le résultat doit être "-16: 00" car il s'agit d'une opération arithmétique. Donc, je l'utilise pour gérer le symbole seulement. – user3449772

+0

@ user3449772 Donc pour tester la vitesse 'charAt (0)' et utiliser 'substring (1)'. – maaartinus