Java StringBuilder是否足够慢,以至于我应该缓存其结果?

Java StringBuilder是否足够慢,以至于我应该缓存其结果?,java,caching,redis,stringbuilder,Java,Caching,Redis,Stringbuilder,我正在编写一些代码从Java访问Redis,因此我需要创建大量字符串作为键。当然,这些键有一个模式,我将重复为相同的访问重新生成相同的键 我正在考虑为生成的密钥实现一个缓存(基于DAO参数),但即使考虑到缓存的速度,我也不知道这种加速是否值得这么复杂 这些键由一个UUID和一个3-7个字符串组成。在这种情况下,StringBuilder的速度是否足够慢,足以保证缓存?只有评测可以确定,但如果要缓存这些,则必须有某种方法从缓存中获取它们,这可能会产生至少与使用StringBuilder相同的开销

我正在编写一些代码从Java访问Redis,因此我需要创建大量字符串作为键。当然,这些键有一个模式,我将重复为相同的访问重新生成相同的键

我正在考虑为生成的密钥实现一个缓存(基于DAO参数),但即使考虑到缓存的速度,我也不知道这种加速是否值得这么复杂


这些键由一个UUID和一个3-7个字符串组成。在这种情况下,StringBuilder的速度是否足够慢,足以保证缓存?

只有评测可以确定,但如果要缓存这些,则必须有某种方法从缓存中获取它们,这可能会产生至少与使用StringBuilder相同的开销

StringBuilder在执行以下操作时在内部使用

String result = strPart1 + strPart2;

只有分析才能确定,但如果要缓存这些,则必须有某种方法从缓存中获取它们,这可能会产生至少与使用StringBuilder相同的开销

StringBuilder在执行以下操作时在内部使用

String result = strPart1 + strPart2;

就像其他人说的,个人资料。如果UUID是固定的,您可以按如下方式加快速度:

public class KeyGenerator {
    private final StringBuilder sb;
    private final int uidLen;

    public KeyGenerator(String uid) {
        sb = new StringBuilder(uid);
        uidLen = uid.length();
    }

    public String getKey(String suffix) {
        sb.setLength(uidLen);
        sb.append(suffix);
        return sb.toString();
    }
}

这样可以节省构建新的StringBuilder和每次需要密钥时追加uid的时间。它也比缓存简单一些。

就像其他人说的,profile。如果UUID是固定的,您可以按如下方式加快速度:

public class KeyGenerator {
    private final StringBuilder sb;
    private final int uidLen;

    public KeyGenerator(String uid) {
        sb = new StringBuilder(uid);
        uidLen = uid.length();
    }

    public String getKey(String suffix) {
        sb.setLength(uidLen);
        sb.append(suffix);
        return sb.toString();
    }
}


这样可以节省构建新的StringBuilder和每次需要密钥时追加uid的时间。它也比缓存简单一点。

评测是确定答案的唯一方法:)如果您最终动态创建了许多相同的字符串,请查看-
String 35; intern()
,如果它是合理小字符串的单个串联,现金查找肯定会慢一些。@Shakedown-interning将如何帮助这一点?@Shakedown-interning不会让查找给定组件数据的字符串变得更容易。它本身也不是一种缓存机制;这是一种确保每个不同的内部字符串值只有一个副本的机制。(因此,可以使用
==
来比较编译时字符串常量,即使是在编译单元之间也是如此。)我看不出这有什么帮助。分析是确定答案的唯一方法:)如果您最终动态创建了许多相同的字符串,请查看-
字符串#intern()
如果是一个相当小的字符串串接,现金查找肯定会慢一些。@Shakedown-interning将如何帮助这一点?@Shakedown-interning不会让查找给定组件数据的字符串变得更容易。它本身也不是一种缓存机制;这是一种确保每个不同的内部字符串值只有一个副本的机制。(因此,可以使用
==
来比较编译时字符串常量,即使是在编译单元之间)。我看不出这有什么帮助。Java中的对象实例化非常快。@MΓΓББLL-OP所说的一切都很快;我们正在相对加快速度。它不仅保存对象实例化,而且每次都将UID字符复制到StringBuilder中。更不用说通过不为每个键创建新的StringBuilder而避免的垃圾收集了。(我不知道密钥生成率是多少,但如果OP关心这个问题,它可能相当高。)@TedHopp-“可能相当高”。。。假设OP的直觉是正确的。“他真的应该先介绍一下,”斯蒂芬斯同意。如果它不高,那么这真是一场茶壶里的风暴。Java中的对象实例化非常快。@MΓΓББLL-OP所说的一切都很快;我们正在相对加快速度。它不仅保存对象实例化,而且每次都将UID字符复制到StringBuilder中。更不用说通过不为每个键创建新的StringBuilder而避免的垃圾收集了。(我不知道密钥生成率是多少,但如果OP关心这个问题,它可能相当高。)@TedHopp-“可能相当高”。。。假设OP的直觉是正确的。“他真的应该先介绍一下,”斯蒂芬斯同意。如果它不高,那么这真的是一场茶壶里的暴风雨。即使是剖面分析也不能真正告诉你答案。您可能会看到一个小的性能提升,但如果您添加了大量长寿命对象,那么您将使垃圾收集变得更昂贵,而这一点很难确定。@Bill-您可以用另一种方法来分析。长时间运行应用程序,只需测量OP关心的StringBuffer调用占应用程序时间的百分比。如果百分比很小,那么通过缓存提高性能的可能性也很小。从这一点,你可以决定是否值得努力优化…是的,这是正确的。然而,很难看出使用分析器对GC有什么影响。即使是评测也不能真正告诉您答案。您可能会看到一个小的性能提升,但如果您添加了大量长寿命对象,那么您将使垃圾收集变得更昂贵,而这一点很难确定。@Bill-您可以用另一种方法来分析。长时间运行应用程序,只需测量OP关心的StringBuffer调用占应用程序时间的百分比。如果百分比很小,那么通过缓存提高性能的可能性也很小。从这一点,你可以决定是否值得努力优化…是的,这是正确的。然而,很难看出使用分析器对GC有什么影响。