2014-12-29 4 views
0

자바에서 약 15 자의 두 문자열을 가지고 있는데,이 두 가지를 비교하기 위해 얼마나 많은 수의 루프 또는 사이클이 필요한지 알고 싶습니다. 그러한 정보를 어떻게 얻을 수 있습니까?자바에서 문자열 비교 성능

예 :

"Hello World".compareTo("Another Hello World")

+1

당신이 바이트 코드 (명령'javap')을 확인하고 자신을 분석을 수행해야합니다 . – ortis

+1

왜 여기에 부동 소수점 연산이 필요합니까? ("flops"= 초당 부동 소수점 연산 수) – User0

답변

2

나는 당신이 CPU 사이클/타이밍에 관심이있는 가정 많은 플롭 또는 사이클이

을 않는 방법을 알고 싶어요.

Windows에서 스레드 당 CPU 시간을 측정하려면 GetThreadTimes WinAPI 함수를 사용할 수 있습니다. JNI를 사용하여 호출을 래핑 할 수 있습니다.

주기를 얻으려면 QueryThreadCycleTime 기능을 사용하는 것이 좋습니다.

두 스레드 모두 스레드 당 시간/사이클을 반환하므로 일부 다른 JVM 스레드가 측정 중에 CPU를 사용하더라도 결과에는 포함되지 않습니다.

편집이 :

그것은 스레드 타이밍 당과 같은 1.5부터 사용할 수 있습니다 :

http://java.sun.com/j2se/1.5.0/docs/api/java/lang/management/ThreadMXBean.html

+0

Windows 플랫폼에서만 유효하지만 CPU 사이클을 실제로 측정하는 방법에 대한 좋은 힌트 – User0

0

java.lang.String 클래스 소스를 사용할 수 있습니다. 그것은 다음과 같은 방식으로 구현되는 JRE 1.6.0_38에서 예를 들어 :

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; 
} 
2

난 당신이 compareTo를 호출 할 때, 실제로 수행되고 있는지의 관점에서 플롭 또는 사이클의 관점에서 그 답을하는 방법을 모른다 실제 프로세싱은 compareTo이 첫 번째 같지 않은 문자를 찾는 데 필요한만큼의 문자 만 테스트하므로 처음 두 문자열이 공유하는 동일한 문자의 수에 따라 달라집니다.

예에서 'H'! = 'A'이후 2 개의 문자열 중 첫 번째 문자 만 검사됩니다. 최악의 경우, 두 문자열이 같은 경우 두 문자열의 모든 문자가 비교됩니다.

+0

* 얼마나 많은 수의 수조 또는 사이클이 걸리는지 * - * CPU주기 * 또는 단지 * 시간 복잡성 *을 의미합니까? – TheLostMind

+0

"예제에서 두 문자열 중 첫 번째 문자 만 검사됩니다 ('H'! = 'A'이후)." 문자열 길이 만 검사됩니다. –

+1

@OlegEstekhin 질문은'compareTo'에 관한 것이지,'equals'에 관한 것이 아닙니다. 2 개의 String의 길이가 다른 경우에서도, 어느 쪽이 사전 적으로 작 으면 (자) 발견하기 위해서는, String의 일부의 문자를 비교할 필요가 있습니다. – Eran

0

O (n)입니다. 여기서 n은 두 문자열의 일치하는 문자 수입니다. 최악의 경우 한 문자열이 다른 문자열의 접두사 인 경우 n은 더 짧은 문자열의 길이가됩니다. 예 : "test".compareTo ("testa").