java中的字符串比较性能

java中的字符串比较性能,java,string,performance,Java,String,Performance,我在java中有两个大约15个字符的字符串,我想知道比较这两个字符串需要多少次触发器或周期。我怎样才能获得这些信息 示例: “Hello World”。compareTo(“另一个Hello World”)java.lang.String类源代码可用。 例如,在JRE 1.6.038中,它以以下方式实现: public int compareTo(String anotherString) { int len1 = count; int len2 = anotherString.

我在java中有两个大约15个字符的字符串,我想知道比较这两个字符串需要多少次触发器或周期。我怎样才能获得这些信息

示例:


“Hello World”。compareTo(“另一个Hello World”)
java.lang.String
类源代码可用。 例如,在JRE 1.6.038中,它以以下方式实现:

public int compareTo(String anotherString) {
    int len1 = count;
    int len2 = anotherString.count;
    int n = Math.min(len1, len2);
    char v1[] = value;
    char v2[] = anotherString.value;
    int i = offset;
    int j = anotherString.offset;

    if (i == j) {
        int k = i;
        int lim = n + i;
        while (k < lim) {
        char c1 = v1[k];
        char c2 = v2[k];
        if (c1 != c2) {
            return c1 - c2;
        }
        k++;
        }
    } else {
        while (n-- != 0) {
        char c1 = v1[i++];
        char c2 = v2[j++];
        if (c1 != c2) {
            return c1 - c2;
        }
        }
    }
    return len1 - len2;
}
public int compareTo(字符串另一个字符串){
int len1=计数;
int len2=anotherString.count;
int n=数学最小值(len1,len2);
字符v1[]=值;
char v2[]=另一个string.value;
int i=偏移量;
int j=另一个字符串.offset;
如果(i==j){
int k=i;
int lim=n+i;
while(k
java.lang.String
类源代码可用。 例如,在JRE 1.6.038中,它以以下方式实现:

public int compareTo(String anotherString) {
    int len1 = count;
    int len2 = anotherString.count;
    int n = Math.min(len1, len2);
    char v1[] = value;
    char v2[] = anotherString.value;
    int i = offset;
    int j = anotherString.offset;

    if (i == j) {
        int k = i;
        int lim = n + i;
        while (k < lim) {
        char c1 = v1[k];
        char c2 = v2[k];
        if (c1 != c2) {
            return c1 - c2;
        }
        k++;
        }
    } else {
        while (n-- != 0) {
        char c1 = v1[i++];
        char c2 = v2[j++];
        if (c1 != c2) {
            return c1 - c2;
        }
        }
    }
    return len1 - len2;
}
public int compareTo(字符串另一个字符串){
int len1=计数;
int len2=anotherString.count;
int n=数学最小值(len1,len2);
字符v1[]=值;
char v2[]=另一个string.value;
int i=偏移量;
int j=另一个字符串.offset;
如果(i==j){
int k=i;
int lim=n+i;
while(k
我不知道如何用触发器或周期来回答这个问题,但就调用
compareTo
时实际执行的操作而言,实际处理取决于两个字符串在开头共享的相同字符数,因为
compareTo
将只测试所需数量的字符,以找到第一个不相等的字符


在您的示例中,只检查两个字符串的第一个字符(因为“H”!=“A”)。在最坏的情况下,如果两个字符串相等,则两个字符串的所有字符都将进行比较。

我不知道如何用触发器或周期来回答这个问题,但在调用
compareTo
时,实际执行了什么操作,实际处理取决于两个字符串在其开头共享的相同字符数,因为
compareTo
将只测试所需数量的字符,以找到第一个不相等的字符


在您的示例中,只检查两个字符串的第一个字符(因为“H”!=“A”)。在最坏的情况下,如果两个字符串相等,将比较两个字符串的所有字符。

它是O(n),其中
n
是两个字符串中匹配的字符数。 在最坏的情况下,一个字符串是另一个字符串的前缀
n
将是较短字符串的长度。 例如,“test”。compareTo(“testa”)。

它是O(n),其中
n
是两个字符串中匹配字符的数量。 在最坏的情况下,一个字符串是另一个字符串的前缀
n
将是较短字符串的长度。 例如“test”。compareTo(“testa”)

我想知道它需要多少次失败或循环

我假设您对CPU周期/计时感兴趣

要在windows下测量每个线程的CPU时间,您可以使用WinAPI函数,您可以使用JNI包装它的调用

要获得循环,您需要使用函数

两者都将返回每个线程的时间/周期,因此即使其他JVM线程在测量期间占用CPU,也不会包含在结果中

编辑:

从1.5开始,每个线程的计时都是可用的:

我想知道它需要多少次失败或循环

我假设您对CPU周期/计时感兴趣

要在windows下测量每个线程的CPU时间,您可以使用WinAPI函数,您可以使用JNI包装它的调用

要获得循环,您需要使用函数

两者都将返回每个线程的时间/周期,因此即使其他JVM线程在测量期间占用CPU,也不会包含在结果中

编辑:

从1.5开始,每个线程的计时都是可用的:


您必须检查字节码(命令
javap
)并自己进行分析。为什么您希望在这里进行浮点运算?(“flops”=每秒浮点运算)您必须检查字节码(command
javap
)并自己进行分析。为什么您希望在这里进行浮点运算?(“flops”=每秒浮点运算)需要多少次flops或周期-他是指CPU周期还是时间复杂度?“在您的示例中,只检查两个字符串的第一个字符(因为'H'!='A')。”是错误的,只检查字符串长度。@OlegEstekhin问题是关于
compareTo
,不
等于
。即使两个字符串的长度不同,您仍然需要比较字符串中的一些字符,以找出哪个字符在字典上更小。这需要多少次触发器或周期?他是指CPU周期还是仅指时间复杂性?“在您的示例中,只会检查两个字符串中的第一个字符(因为'H'!=“A')”是错误的,只会检查字符串长度。@OlegEstekhin问题是关于
比较到
,而不是
等于
。即使这两个字符串的长度不同,您仍然必须比较字符串的一些字符,以确定是哪个字符串