2013-09-10 3 views
-3

Из кода для класса String видно, что length() возвращает value.length(here).Длина строки() Неисправность

Скажем, я хочу напечатать длину строки strlength() раз.

Q1) Что было бы лучшим способом сделать это из следующих фрагментов кода: (если у вас есть лучший способ предложить, пожалуйста)

Код 1:

public static void main(String[] args) {   
     String str="Hello World"; 
     for(int i=0;i<str.length();++i){ 
      System.out.println(str.length()); 
     }   
} 

Code 2 (я предпочитаю это одно дело читаемости он предлагает о программе ...)

public static void main(String[] args) {   
     String str="Hello World"; 
     final int len=str.length(); 
     for(int i=0;i<len;++i){ 
      System.out.println(len); 
     }   
    } 

Код 3:

public static void main(String[] args) {   
     String str="Hello World"; 
     int len=str.length(); 
     for(int i=0;i<len;++i){ 
      System.out.println(len); 
     }   
    } 

Q2), который является наиболее оптимизированным способом или они одинаковы?

Q3) Содержит ли компилятор длину в байт-коде, сгенерированную для этой программы?

Спасибо!

+5

Для небольшой программы, подобной этой, вы можете скомпилировать программу и посмотреть на байт-код. Следуйте вместе с wiki-статьей для инструкций байтового кода. JVM - это совсем другая история. –

+0

Я не понимаю, что вы пытаетесь сделать ... зачем вы хотите распечатать длину 'str' 11 раз? – StormeHawke

+1

Время, затрачиваемое на вызов 'length()', незначительно по сравнению с временем, затрачиваемым на распечатку результата. –

ответ

1

Все предлагаемые фрагменты являются микро-оптимизациями и не приносят заметного улучшения производительности. Для чего стоит, вот еще один вариант ...

final String str = "Hello World"; 
for (int i = 0, n = str.length(); i < n; ++i) { 
    System.out.println(n); 
} 

В чем разница? что n определяется на объем блока, в котором он используется, что ++iможет быть быстрее (это открыто для обсуждения, увидеть эту question) и что String объект, будучи final, может быть оптимизированы для быстрого доступа компилятор (и я размышляю), но это все. Ни один из фрагментов не будет значительным быстрее, чем другие, когда компилятор JIT запускается, что действительно важно, то, что легче читать и понимать.

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

+1

Разве это не должно быть запятой между 'i = 0' и' n = str.length() ', а не точкой с запятой? –

+0

@JoshuaTaylor oops, typo. Благодаря! –

4

Общее правило java: не оптимизируйте, прежде чем у вас возникнут проблемы с производительностью.

Особенно в таких случаях как этот. Вы можете подумать о производительности сетевого подключения или базы данных. Эти вещи могут занять несколько секунд.

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