2014-09-05 73 views
0

我正在构建一个使用JodaTime库在算术上对两个时间段进行求和的Java方法。 我的代码工作正常,但我认为这是可能的优化,以减少时间执行... 不幸的是,我是新的JodaTime。如何优化此代码? (需要JodaTime)

这是我的代码:

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; 
    } 
} 

谢谢! :)

+5

此问题似乎更适合[代码评论](http://codereview.stackexchange.com/)。虽然我建议缩小优化要求。 – Mena 2014-09-05 10:20:02

+2

如果你想总结两个时期,你为什么要使用字符串?为什么你不使用乔达时间的'周期'类来处理*一切*? “sum”方法的输入应该是两个时间段,IMO。 (或者可能有两个持续时间 - 目前还不清楚你的真实情况是什么。)然后,你可以分离出周期/持续时间解析。 – 2014-09-05 10:21:11

+0

感谢您的支持!无论如何,我使用两个字符串,因为输入来自数据库...并且数据按原样存储。 – user3449772 2014-09-05 10:25:27

回答

2

这段代码真的很需要CR。

如果您想使速度更快,请先将其缩短。 JVM拒绝优化超长方法。

关于优化,它看起来像是在浪费大部分时间与字符串。无论如何,清理代码,然后分析,,然后优化是正确的顺序。

从你的程序不完全清楚你在做什么,但是,它不可能是非常正确的。这样做

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

意味着你变换例如,--12:--34---12:34。这是打算?如果不是,短跑允许在哪里?如果只在-12:34这样的第一个位置,那么time1_out.substring(1)肯定会更干净更快。等等...

我使用两个字符串,因为输入来自数据库

是否有不能存储日期或数字的任意数据库?如果12:34表示大约一半的时间,则将其存储为DATE。如果这意味着12小时34分钟或12分34秒,则将其存储为INTEGER。如果有更好的数据类型,永远不要操纵字符串。

+0

感谢您的回复!替换(“ - ”,“”)用于管理负小时数。实际上,例如,如果我的第一个输入等于“-8:00”,第二个输入等于“-8:00”,结果必须是“-16:00”,因为是算术运算。所以,我只用这个来管理符号。 – user3449772 2014-09-05 11:06:44

+0

@ user3449772所以对于速度测试'charAt(0)'并使用'substring(1)'。 – maaartinus 2014-09-05 11:36:17