我正在构建一个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;
}
}
谢谢! :)
答案 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
。如果有更好的数据类型,切勿操纵字符串。