gpt4 book ai didi

android - 在 Android 中格式化大量日期/时间对象的最快方法是什么?

转载 作者:太空狗 更新时间:2023-10-29 12:45:01 24 4
gpt4 key购买 nike

我正在寻找生成将在文本文件输出中使用的一长串日期/时间的最快方法。我正在努力实现的一个例子:

1, 2013-10-17 00:00:00,数据,数据
2, 2013-10-17 00:00:01,数据,数据
3, 2013-10-17 00:00:02,数据,数据
....

这是我必须遵守的格式,不能更改。这个数据可以轻松达到100,000+行。我目前正在做的是:

//text_output is a printstream to SD card
logged_time = Calendar.getInstance();
dateFormat = FastDateFormat.getInstance("yyyy-MM-dd HH:mm:ss");
// these values are gathered from a device via bluetooth
logged_time.set(year, month, day, hour, minute, second);

while(I_still_have_lines_to_process){
// print the line
text_output.print(line_count + "," + dateFormat.format(logged_time.getTime()) + data etc.)
// add the sample rate to calculate next date/time
logged_time.add(Calendar.SECOND, sample_rate);
}

我发现对于 250k 行,这个过程仅用于格式化就需要大约 50 秒。我还必须解析数据本身并通过蓝牙传输。如果我能加快速度,用户体验将会大大改善。有没有更快的方法来做到这一点?

感谢阅读!

最佳答案

我将您的代码重写为我可以实际运行和测试的代码,最后得到以下代码。它很粗糙,但对我有用,我会以此为基础进行工作。如果有不符合您实际行为的地方,请仔细阅读。

private static final int SAMPLE_RATE = 1;

public static void main(String[] args) {
long time = System.currentTimeMillis();

Calendar logged_time = Calendar.getInstance();
Format dateFormat = FastDateFormat.getInstance("yyyy-MM-dd HH:mm:ss");

try (BufferedWriter writer = Files.newBufferedWriter(Paths.get("out.txt"), StandardCharsets.UTF_8)) {
for (int i = 0; i < 100000; i++) {
// print the line
writer.write(i + ", " + dateFormat.format(logged_time.getTime()));
writer.newLine();

// add the sample rate to calculate next date/time
logged_time.add(Calendar.SECOND, SAMPLE_RATE);
}
} catch (IOException e) {
throw new RuntimeException(e);
}

System.out.println(System.currentTimeMillis() - time + " ms");
}

当我在我的机器上运行它时,我得到的平均时间正好是 1000 毫秒。

简单的改变

dateFormat.format(logged_time.getTime())

dateFormat.format(logged_time)

平均耗时 730 毫秒。您不需要每次都创建新的 Date 对象。

但我们可以做得更好!有很多重复的工作 - 我们不必每次都一次又一次地格式化整个日期。让我们缓存大部分格式化日期,只检查是否需要在秒数溢出时重新格式化它:

private static final int SAMPLE_RATE = 1;

public static void main(String[] args) {
long time = System.currentTimeMillis();

Calendar logged_time = Calendar.getInstance();
Format dateFormatNoSecs = FastDateFormat.getInstance("yyyy-MM-dd HH:mm:");
Format dateFormatSecs = FastDateFormat.getInstance("ss");

String lastFormattedDateNoSecs = dateFormatNoSecs.format(logged_time);
int lastSecs = logged_time.get(Calendar.SECOND);

try (BufferedWriter writer = Files.newBufferedWriter(Paths.get("out.txt"), StandardCharsets.UTF_8)) {
for (int i = 0; i < 100000; i++) {
int secs = logged_time.get(Calendar.SECOND);
if (secs < lastSecs) {
// at least minutes changed, we need to reformat it
lastFormattedDateNoSecs = dateFormatNoSecs.format(logged_time);
}
// print the line
writer.write(i + ", " + lastFormattedDateNoSecs + dateFormatSecs.format(logged_time));
writer.newLine();

// add the sample rate to calculate next date/time
logged_time.add(Calendar.SECOND, SAMPLE_RATE);
lastSecs = secs;
}
} catch (IOException e) {
throw new RuntimeException(e);
}

System.out.println(System.currentTimeMillis() - time + " ms");
}

610 毫秒。

最后的微优化:几秒钟的自定义手动格式化程序。奇怪的是,DecimalFormat 在秒格式化方面比 FastDateFormat 慢。但是一个简单的开关是最快的:

public class TwoDigitIntegerFormatter {

public static String format(int number) {
assert (number >= 0) && (number <= 99);

switch (number) {
case 0: return "00";
case 1: return "01";
case 2: return "02";
case 3: return "03";
case 4: return "04";
case 5: return "05";
case 6: return "06";
case 7: return "07";
case 8: return "08";
case 9: return "09";
default: return String.valueOf(number);
}
}

}

我们也可以手动维护秒数:

private static final int SAMPLE_RATE = 1;

public static void main(String[] args) {
long time = System.currentTimeMillis();

Calendar logged_time = Calendar.getInstance();
Format dateFormatNoSecs = FastDateFormat.getInstance("yyyy-MM-dd HH:mm:");

String lastFormattedDateNoSecs = dateFormatNoSecs.format(logged_time);
int secs = logged_time.get(Calendar.SECOND);

try (BufferedWriter writer = Files.newBufferedWriter(Paths.get("out.txt"), StandardCharsets.UTF_8)) {
for (int i = 0; i < 100000; i++) {
if (secs > 59) {
// at least minutes changed, we need to reformat it
lastFormattedDateNoSecs = dateFormatNoSecs.format(logged_time);
secs %= 60;
}
writer.write(i + ", " + lastFormattedDateNoSecs + TwoDigitIntegerFormatter.format(secs));
writer.newLine();

// add the sample rate to calculate next date/time
logged_time.add(Calendar.SECOND, SAMPLE_RATE);
secs += SAMPLE_RATE;
}
} catch (IOException e) {
throw new RuntimeException(e);
}

System.out.println(System.currentTimeMillis() - time);
}

510 毫秒。即使您的代码不完全相同,您也可以使用此解决方案中的想法来帮助自己。

关于android - 在 Android 中格式化大量日期/时间对象的最快方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19432759/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com