我该如何优化此代码? (需要JodaTime)

时间:2014-09-05 10:17:37

标签: java performance optimization jodatime period

我正在构建一个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;
    }
}

谢谢! :)

1 个答案:

答案 0 :(得分: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。如果有更好的数据类型,切勿操纵字符串。