有没有可以使用时间戳的高性能java库?
我正在寻找高性能Java库,该库提供的方法允许我获得:有没有可以使用时间戳的高性能java库?,java,performance,datetime,timestamp,Java,Performance,Datetime,Timestamp,我正在寻找高性能Java库,该库提供的方法允许我获得: 当前小时数(0-24) 当日(1-31) 本周(1-52) 当月(1-12) 本季(1-4) 本年度(年或年) 对我来说,表现是一个最重要的问题。这就是为什么我不能使用标准日历类。最好的解决方案是在不创建新对象的情况下进行所有计算 补充:为了澄清,我再提一次:每秒超过100000次操作。你确定日历太慢还是你相信它?你测量它了吗 用Java创建新对象非常便宜。留着它们是很昂贵的 也就是说,可以尝试将Java代码中的算法复制到静态助手方法中。您
补充:为了澄清,我再提一次:每秒超过100000次操作。你确定
日历
太慢还是你相信它?你测量它了吗
用Java创建新对象非常便宜。留着它们是很昂贵的
也就是说,可以尝试将Java代码中的算法复制到静态助手方法中。您确定
Calendar
太慢了,还是相信它?你测量它了吗
用Java创建新对象非常便宜。留着它们是很昂贵的
也就是说,可以尝试将Java代码中的算法复制到静态助手方法中。只使用一个对象,然后按如下方式更新:
Date d = new Date();
...
d.setTime(System.currentTimeMillis());
仅使用一个对象并按如下方式更新它的时间:
Date d = new Date();
...
d.setTime(System.currentTimeMillis());
您可以使用,如果不满意,您可以使用
这可以帮助您解决问题。您可以使用,如果不满意,您可以使用
这可以帮助您解决问题。您可以使用它,因为它比日历快得多,请执行以下操作:
LocalDateTime now = new LocalDateTime(); // automatically points to current datetime.
int hour = now.getHourOfDay();
int day = now.getDayOfMonth();
int week = now.getWeekOfWeekyear();
int month = now.getMonthOfYear();
int year = now.getYear();
int season = getSeason(day, month);
getSeason()易于实现。没有一种解决方案可以在不创建任何对象的情况下完成所有这一切。顺便问一下,你为什么需要这么多的表现 您可以使用,因为它比日历快得多,请执行以下操作:
LocalDateTime now = new LocalDateTime(); // automatically points to current datetime.
int hour = now.getHourOfDay();
int day = now.getDayOfMonth();
int week = now.getWeekOfWeekyear();
int month = now.getMonthOfYear();
int year = now.getYear();
int season = getSeason(day, month);
getSeason()易于实现。没有一种解决方案可以在不创建任何对象的情况下完成所有这一切。顺便问一下,你为什么需要这么多的表现 您可以获得当前时间,并通过除法和余数计算当前小时、分钟、秒、毫秒。日、月、年每天只改变一次,所以你只需要在它改变时计算它 您可以使用缓存的日/月/年,以亚微秒的时间计算剩余时间,而无需创建对象(每天不止一次)
关于夏令时的变化是如何发生的,有各种各样的假设。您可能需要更改检查周期以满足您的需要。您可以获取当前时间并通过除法和余数计算当前小时、分钟、秒、毫秒。日、月、年每天只改变一次,所以你只需要在它改变时计算它 您可以使用缓存的日/月/年,以亚微秒的时间计算剩余时间,而无需创建对象(每天不止一次)
关于夏令时的变化是如何发生的,有各种各样的假设。您可能需要更改检查周期以满足您的需要。请注意这相当昂贵,但通常可以通过调用该方法一次并重新使用来获取日历对象(除非您需要每个线程的日历:日历不是线程安全的)。请注意这相当昂贵,但是您通常可以通过调用该方法一次并重用来获取日历对象(除非您需要每个线程使用日历:日历不是线程安全的)。您实际上可以使用excellant joda时间库来实现这一点。joda中的
年表
实现提供了DateTimegetHour
getDay
类型方法背后的逻辑。如果希望跳过创建DateTime
实例,那么直接使用它没有问题
long msSinceEpoch = System.currentTimeMillis();
Chronology chronology = ISOChronology.getInstanceUTC() // This can be static
chronology.hourOfDay().get(msSinceEpoch);
chronology.dayOfMonth().get(msSinceEpoch);
chronology.weekOfWeek().get(msSinceEpoch);
chronology.monthOfYear().get(msSinceEpoch);
chronology.years().get(msSinceEpoch);
会话不是joda的概念。根据你自己的规则,你必须从下个月算起
请参见您实际上可以使用excellant joda时间库来执行此操作。joda中的
年表
实现提供了DateTimegetHour
getDay
类型方法背后的逻辑。如果希望跳过创建DateTime
实例,那么直接使用它没有问题
long msSinceEpoch = System.currentTimeMillis();
Chronology chronology = ISOChronology.getInstanceUTC() // This can be static
chronology.hourOfDay().get(msSinceEpoch);
chronology.dayOfMonth().get(msSinceEpoch);
chronology.weekOfWeek().get(msSinceEpoch);
chronology.monthOfYear().get(msSinceEpoch);
chronology.years().get(msSinceEpoch);
会话不是joda的概念。根据你自己的规则,你必须从下个月算起
请看我已经读了很多关于Joda Time的帖子,所以现在我终于下载并尝试了一下 加雷思·戴维斯的回答已经被接受,我对此没有异议。但我很想知道乔达时代在哪里起了作用 基于这个问题和公认的答案,我制作了一个类来比较JDK日历和Joda时间年表的执行时间 我发现日历实现的运行速度始终更快,而不是原来的两倍
import java.util.Calendar;
import java.util.Date;
import org.joda.time.Chronology;
import org.joda.time.chrono.ISOChronology;
public class CalendarTest {
private static final int ITERATIONS = 1000000;
public static void main(String[] args) {
for (int i = 0; i < 10; i++) {
jdkCalendar();
jodaChronology();
}
}
private static void jdkCalendar() {
long start = System.currentTimeMillis();
Calendar c = Calendar.getInstance();
int hourOfDay = 0;
int dayOfMonth = 0;
int weekOfYear = 0;
int month = 0;
int year = 0;
for (int i = 0; i < ITERATIONS; i++) {
c.setTimeInMillis(System.currentTimeMillis());
hourOfDay = c.get(Calendar.HOUR_OF_DAY);
dayOfMonth = c.get(Calendar.DAY_OF_MONTH);
weekOfYear = c.get(Calendar.WEEK_OF_YEAR);
month = c.get(Calendar.MONTH);
year = c.get(Calendar.YEAR);
}
long duration = System.currentTimeMillis() - start;
System.err.printf("jdk: duration %d, hourOfDay: %d, dayOfMonth: %d, weekOfYear: %d, month: %d, year: %d\n", duration, hourOfDay, dayOfMonth, weekOfYear, month, year);
}
private static void jodaChronology() {
long start = System.currentTimeMillis();
Chronology chronology = ISOChronology.getInstanceUTC(); // This can be static
int hourOfDay = 0;
int dayOfMonth = 0;
int weekOfYear = 0;
int month = 0;
int year = 0;
for (int i = 0; i < ITERATIONS; i++) {
long msSinceEpoch = System.currentTimeMillis();
hourOfDay = chronology.hourOfDay().get(msSinceEpoch);
dayOfMonth = chronology.dayOfMonth().get(msSinceEpoch);
weekOfYear = chronology.weekOfWeekyear().get(msSinceEpoch);
month = chronology.monthOfYear().get(msSinceEpoch);
year = chronology.years().getValue(msSinceEpoch);
}
long duration = System.currentTimeMillis() - start;
System.err.printf("joda: duration %d, hourOfDay: %d, dayOfMonth: %d, weekOfYear: %d, month: %d, year: %d\n", duration, hourOfDay, dayOfMonth, weekOfYear, month, year);
}
}
我已经读了很多关于Joda Time on的帖子,所以现在我终于下载并尝试了一下 加雷思·戴维斯的回答已经被接受,我对此没有异议。但我很想知道乔达时代在哪里起了作用 基于这个问题和公认的答案,我制作了一个类来比较JDK日历和Joda时间年表的执行时间 我发现日历实现的运行速度始终更快,而不是原来的两倍
import java.util.Calendar;
import java.util.Date;
import org.joda.time.Chronology;
import org.joda.time.chrono.ISOChronology;
public class CalendarTest {
private static final int ITERATIONS = 1000000;
public static void main(String[] args) {
for (int i = 0; i < 10; i++) {
jdkCalendar();
jodaChronology();
}
}
private static void jdkCalendar() {
long start = System.currentTimeMillis();
Calendar c = Calendar.getInstance();
int hourOfDay = 0;
int dayOfMonth = 0;
int weekOfYear = 0;
int month = 0;
int year = 0;
for (int i = 0; i < ITERATIONS; i++) {
c.setTimeInMillis(System.currentTimeMillis());
hourOfDay = c.get(Calendar.HOUR_OF_DAY);
dayOfMonth = c.get(Calendar.DAY_OF_MONTH);
weekOfYear = c.get(Calendar.WEEK_OF_YEAR);
month = c.get(Calendar.MONTH);
year = c.get(Calendar.YEAR);
}
long duration = System.currentTimeMillis() - start;
System.err.printf("jdk: duration %d, hourOfDay: %d, dayOfMonth: %d, weekOfYear: %d, month: %d, year: %d\n", duration, hourOfDay, dayOfMonth, weekOfYear, month, year);
}
private static void jodaChronology() {
long start = System.currentTimeMillis();
Chronology chronology = ISOChronology.getInstanceUTC(); // This can be static
int hourOfDay = 0;
int dayOfMonth = 0;
int weekOfYear = 0;
int month = 0;
int year = 0;
for (int i = 0; i < ITERATIONS; i++) {
long msSinceEpoch = System.currentTimeMillis();
hourOfDay = chronology.hourOfDay().get(msSinceEpoch);
dayOfMonth = chronology.dayOfMonth().get(msSinceEpoch);
weekOfYear = chronology.weekOfWeekyear().get(msSinceEpoch);
month = chronology.monthOfYear().get(msSinceEpoch);
year = chronology.years().getValue(msSinceEpoch);
}
long duration = System.currentTimeMillis() - start;
System.err.printf("joda: duration %d, hourOfDay: %d, dayOfMonth: %d, weekOfYear: %d, month: %d, year: %d\n", duration, hourOfDay, dayOfMonth, weekOfYear, month, year);
}
}
每次在调用字段的getter之前需要创建
DateTime
类的实例时,我建议使用JodaTime。但当您调用getter方法多于创建实例时,最好使用JDK 8中的java.time库或backport
这是因为JodaTime的DateTime
类只存储一个long iMillis
,因为从新纪元开始,某些字段的所有getter,如minuteOfHour、dayOfMonth,总是从头开始计算该值。但是java.time的ZonedDateTime
将这些字段存储在单独的变量中,例如:int year、short month、short da