我知道我可以使用SimpleDateFormat以yyyyMMdd格式获得一天的字符串,但是当我在我的机器上测试时,它会引入一些花费2秒钟进行10万次操作的成本
原因我可以缓存这个值并在00:00Am安排一个计时器并更新这个日期缓存,但我希望我能够以一种简单的方式获得这个值,这不会引入明确的成本但是如果我可以
我将以100万tps的速度调用此操作。
是否有一种简单而快速的方法可以做到这一点。
答案 0 :(得分:1)
我在本地检查:
1M - ~2.5秒:
10M - ~49秒:
public static List<String> convert(Date[] dates) {
List<String> res = new ArrayList<>(dates.length);
for (Date date : dates)
res.add(new SimpleDateFormat("YYYYMMdd", Locale.US).format(date));
return res;
}
1M - ~1.1秒:
10M - ~26秒:
public static List<String> convert(Date[] dates) {
List<String> res = new ArrayList<>(dates.length);
DateFormat df = new SimpleDateFormat("YYYYMMdd", Locale.US);
for (Date date : dates)
res.add(df.format(date));
return res;
}
1M - ~1秒:
10M - ~15.5秒:
public static List<String> convert3(Date[] dates) throws ExecutionException, InterruptedException {
int size = 1000;
ThreadLocal<SimpleDateFormat> df = ThreadLocal.withInitial(() -> new SimpleDateFormat("YYYYMMdd", Locale.US));
ExecutorService pool = Executors.newFixedThreadPool(10);
List<Future<List<String>>> futures = new ArrayList<>(dates.length);
for (int i = 0; i < dates.length; i += size) {
int ii = i;
futures.add(pool.submit(() -> {
List<String> res = new ArrayList<>(size);
SimpleDateFormat sdf = df.get();
for (int j = 0; j < size && ii + j < dates.length; j++)
res.add(sdf.format(dates[ii + j]));
return res;
}));
}
List<String> res = new ArrayList<>(dates.length);
for (Future<List<String>> future : futures)
res.addAll(future.get());
pool.shutdown();
return res;
}
我需要在内存中以高tps积累一些数字然后 使用ST_ {DATANO}
将它们保存在redis中
我想再想一想。我不知道是不是可以准确,但你可以看看我的想法。怎么样只需要花费很长时间毫秒,并删除你不关心的所有部分:时间部分。这是一个例子:
final long msOneDay = TimeUnit.DAYS.toMillis(1); // milliseconds in one day: 86400000
Date originalDate = new Date(); // e.g. Sat Jan 03 12:36:05 MSK 1987
long dayId = originalDate .getTime() / msOneDay; // 6211, this value you can store in Redis
Date restoredDate = new Date(dayId * msOneDay); // Sat Jan 03 03:00:00 MSK 1987 - correct date without time information
1M - ~1秒:
10M - ~10.6秒:
public static List<String> convert(Date[] dates) {
List<String> res = new ArrayList<>(dates.length);
long msOneDay = TimeUnit.DAYS.toMillis(1);
for (Date date : dates)
res.add(String.valueOf(date.getTime() / msOneDay));
return res;
}