gpt4 book ai didi

java - 什么是使 Java8 流生成格式化字符串的高效方法

转载 作者:行者123 更新时间:2023-11-29 10:13:33 29 4
gpt4 key购买 nike

上下文:给定一个目录,我想列出其中名称中包含模式的所有文件,按 lastModified 时间戳排序,并将此列表格式化为 Json 字符串,其中我获取每个文件的名称和时间戳:

[{"name": "somefile.txt", "timestamp": 123456},
{"name": "otherfile.txt", "timestamp": 456789}]

我有以下代码:

private StringBuilder jsonFileTimestamp(File file) {
return new StringBuilder("{\"name\":\"")
.append(file.getName())
.append("\", \"timestamp\":")
.append(file.lastModified())
.append("}");
}

public String getJsonString(String path, String pattern, int skip, int limit) throws IOException {

return Files.list(Paths.get(path))
.map(Path::toFile)
.filter(file -> {
return file.getName().contains(pattern);
})
.sorted((f1, f2) -> {
return Long.compare(f2.lastModified(), f1.lastModified());
})
.skip(skip)
.limit(limit)
.map(f -> jsonFileTimestamp(f))
.collect(Collectors.joining(",", "[", "]"));
}

这很好用。我只关心 StringBuilder 实例化(或字符串连接)的性能。只要文件数量保持较小就可以了(这是我的情况,所以我很好)但我很好奇:你会建议什么作为优化?我觉得我应该将 reduce 与正确的累加器和组合器一起使用,但我无法理解它。

谢谢。


更新

我最终进行了以下“优化”:

private StringBuilder jsonFileTimestampRefactored(StringBuilder res, File file) {
return res.append(res.length() == 0 ? "" : ",")
.append("{\"name\":\"")
.append(file.getName())
.append("\", \"timestamp\":")
.append(file.lastModified())
.append("}");
}

public String getJsonStringRefactored(String path, String pattern, int skip, int limit) throws IOException {
StringBuilder sb = Files.list(Paths.get(path))
.map(Path::toFile)
.filter(file -> file.getName().contains(pattern))
.sorted((f1, f2) -> Long.compare(f2.lastModified(), f1.lastModified()))
.skip(skip)
.limit(limit)
.reduce(new StringBuilder(),
(StringBuilder res, File file) -> jsonFileTimestampRefactored(res, file),
(StringBuilder a, StringBuilder b) -> a.append(a.length() == 0 || b.length() == 0 ? "" : ",").append(b))
;
return new StringBuilder("[").append(sb). append("]").toString();
}

此版本仅创建 2 个 StringBuilder 实例,而旧版本实例化的实例与目录中的文件一样多。

在我的工作站上,第一个实现需要 1289 毫秒来完成超过 3379 个文件,而第二个需要 1306 毫秒。当我期望(非常小的)节省时,第二个实现花费了我 1% 的时间。

我不觉得新版本更容易阅读或维护,所以我会保留旧版本。

谢谢大家。

最佳答案

字符串格式是应用程序性能的一个微不足道的部分,几乎不值得优化;只有在分析显示实际热点时才考虑它。事实上,大多数应用程序都使用反射 JSON 映射器,它们的瓶颈在其他地方(通常是 I/O)。您正在使用的 StringBuilder 方法是您在 Java 中执行此操作的最有效方法,无需手动摆弄字符数组,它甚至比我自己走得更远(我会使用 String#格式()).

为了清晰起见,请编写您的代码。当前版本很好。

关于java - 什么是使 Java8 流生成格式化字符串的高效方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25165471/

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