Какой вид кавычки является более эффективным? - PullRequest
1 голос
/ 16 ноября 2009

Просто любопытно, что эффективнее?

Это:

String a = someString + "." + anotherString;

Или это:

String a = someString + '.' + anotherString;

Ответы [ 4 ]

13 голосов
/ 16 ноября 2009

Вы действительно не должны заботиться, если это не все, что вы делаете, тысячи раз в секунду, в течение нескольких часов.

Ходят слухи, что StringBuilder самый быстрый.

Попробуйте оба из них, запустив цикл миллион раз и записав время, которое требуется, затем доложите остальным.

12 голосов
/ 16 ноября 2009

Глядя на код для StringBuilder.append и AbstractStringBuilder.append, я бы ожидал '.' форма будет быстрее.

Это имеет меньшее значение, в основном:

  • Не нужно проверять нулевое значение, так как символ не может быть нулевым
  • Не выполняется оптимизация для добавляемой пустой строки
  • Не нужно извлекать длину для добавления - она ​​всегда будет 1
  • Необходимо выполнить только одно присваивание в массив, а не цикл с одной итерацией

Как и все остальные, я бы не ожидал, что разница будет существенной в реальном коде приложения.

Я не знаю, будет ли правильным для компилятора Java понять, что добавляемая строка является константой строки длины 1, и вместо этого преобразовать ее в символьный литерал - или это будет беспокоить, даже если будет действительным.

6 голосов
/ 16 ноября 2009

Они очень похожи. '.' немного быстрее, но разница незначительна (около 20 мс в цикле 10 миллионов).

Вот мой тест:

$cat UsingC.java  UsingS.java  
public class UsingC { 
    public static void main( String [] args ) { 
        String someString  = "";
        String anotherString = "";

        int i = 0;
        while( i++ < 10000000 ) { 
            String a = someString + '.' + anotherString;
        }
    }
}
public class UsingS{ 
    public static void main( String [] args ) { 
        String someString  = "";
        String anotherString = "";

        int i = 0;
        while( i++ < 10000000 ) { 
            String a = someString + "." + anotherString;
        }
    }
}
$for i in 1 2 3 4 5 ; do time java UsingC; done

real    0m1.643s
user    0m1.424s
sys 0m0.108s

real    0m1.670s
user    0m1.468s
sys 0m0.056s

real    0m2.023s
user    0m1.448s
sys 0m0.080s

real    0m1.669s
user    0m1.432s
sys 0m0.088s

real    0m1.674s
user    0m1.416s
sys 0m0.104s
$for i in 1 2 3 4 5 ; do time java UsingS; done

real    0m2.344s
user    0m1.584s
sys 0m0.136s

real    0m2.057s
user    0m1.640s
sys 0m0.084s

real    0m2.112s
user    0m1.732s
sys 0m0.072s

real    0m2.482s
user    0m1.704s
sys 0m0.108s

real    0m2.134s
user    0m1.788s
sys 0m0.072s

Вы можете сделать среднее и / или создать более сложный тест.

В любом случае они оба используют StringBuilder внутри.

1 голос
/ 16 ноября 2009

Компилятор Java превратит любое выражение конкатенации строк в эквивалентную последовательность операций StringBuilder. Можно с уверенностью предположить, что последовательность будет близка к оптимальной. Действительно, в этом конкретном примере я ожидал бы, что одна и та же (оптимальная) последовательность будет сгенерирована в обоих случаях. Но даже если это не так, разница, вероятно, будет небольшой.

О таких вещах стоит беспокоиться, только если профилировщик скажет вам, что конкретное утверждение является узким местом в вашем коде. Преждевременная оптимизация бессмысленна (в лучшем случае) и может даже быть вредной.

Совет от Sun состоит в том, что оптимизация кода Java вручную может быть на самом деле более медленным кодом, потому что результирующая последовательность байт-кода становится слишком сложной для компилятора JIT, чтобы она могла оптимизироваться должным образом. Лучший совет - просто написать код и доверить компиляторам Javac и JIT хорошую работу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...