2014-12-29 4 views
0

У меня две строки из 15 символов в java, и я хочу знать, сколько флопов или циклов требуется для сравнения этих двух. как я могу получить такую ​​информацию.Сравнение производительности строк в java

пример:

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

+1

вы должны проверить байт-код (команда 'javap') и выполнять анализ самостоятельно , – ortis

+1

Почему вы ожидаете операции с плавающей запятой здесь? («flops» = операции с плавающей запятой в секунду) – User0

ответ

2

Я хочу знать, сколько провалов или циклы занимают

Я предполагаю, что вы заинтересованы в CPU циклов/таймингах.

Чтобы измерить время процессора в потоке под окнами, вы можете использовать функцию WinAPI GetThreadTimes, вы можете переносить свой вызов с помощью JNI.

Чтобы получить циклы, вы захотите использовать функцию QueryThreadCycleTime.

Оба будут возвращать время/циклы на поток, поэтому, даже если какой-либо другой поток JVM будет принимать процессор во время измерения, он не будет включен в результаты.

EDIT:

Похоже на времени резьбы доступен, начиная с версии 1.5:

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

+0

Хороший намек на то, как реально измерить циклы процессора, хотя он действителен только на платформе Windows – 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»). В худшем случае, если две строки равны, все символы обеих строк будут сравниваться.

+0

* Сколько циклов или циклов требуется * - Имеет ли он значение * Циклы процессора * или просто * временная сложность *? – TheLostMind

+0

«В вашем примере будет рассмотрен только первый символ двух строк (так как« H »! =« A »)». неверно, будут проверяться только длины строк. –

+1

@OlegEstekhin Вопрос о 'compareTo', а не' equals'. Даже если две строки имеют разную длину, вам все равно придется сравнивать некоторые символы строк, чтобы выяснить, какая из них лексикографически меньше. – Eran

0

Это 0 (n), где n - количество совпадающих символов в обеих строках. В худшем случае, когда одна строка является префиксом другой n, будет длиной более короткой строки. Например, «test» .compareTo («testa»).

Смежные вопросы