Какая производительность кода лучше? - PullRequest
0 голосов
/ 03 августа 2011

У меня два одинаковых условия, и я хочу знать, что хорошо в исполнении?

if(str_final.charAt(str_final.length() -1) == 'a'
    || str_final.charAt(str_final.length() -1) == 'b' )
{
    // body 
}

-------------------- ИЛИ --------------------

char temp = str_final.charAt(str_final.length() -1);
if( temp == 'a' || temp == 'b')
{
    // body
}

Ответы [ 9 ]

2 голосов
/ 03 августа 2011

Вторая версия чуть-чуть быстрее.

Причина:
2 метода вызывают меньше (если они не заканчиваются на 'a').
Но оба не намного больше, чем return variable;:

  • charAt() - это только доступ к массиву, а
  • length() строки также предварительно вычислен.
1 голос
/ 03 августа 2011

Я бы выбрал второй вариант, потому что его легче читать. Также str_final.length() и str_final.charAt() вызываются только один раз.

Кроме того, вместо того, чтобы называть символ temp, назовите его чем-нибудь более значимым, например lastChar.

Вы можете даже рассмотреть возможность использования оператора switch, если у вас есть более двух символов для проверки:

char lastChar = str_final.charAt(str_final.length() -1);
switch (lastChar) {
  case 'a':
  case 'b':
    //do something
    break;
  case 'c':
    //something else
    break;
  case 'd':
    //something else
    break;
}
1 голос
/ 03 августа 2011

Это может быть такая же производительность, как оптимизирующий компилятор (или просто компилятор / точка доступа) может изменить 1-ю версию на 2-ю во время компиляции.

1 голос
/ 03 августа 2011

Второй код является лучшим вариантом, так как str_final.charAt (str_final.length () -1) просто выполняется один раз и в худшем случае.

char temp = str_final.charAt(str_final.length() -1);

if( temp == 'a' || temp == 'b')
{
  // body
}

В другом случае str_final.charAt (str_final.length() -1) должен быть выполнен дважды.

0 голосов
/ 03 августа 2011

Вторая версия лучше, хотя она имеет крошечную производительность по сравнению с первой, у нее также есть несколько преимуществ: 1. Читаемость 2. Техническое обслуживание. Предположим, что для этого типа кода нужно проверить больше условий (например, 10)изменить логику, только в одном месте.

0 голосов
/ 03 августа 2011

Второй вариант будет быстрее, а также гораздо более читабельным, однако лучше использовать другое имя, чем «temp»

0 голосов
/ 03 августа 2011

Второй не может быть медленнее, поэтому я бы сказал, что второй, так как он по крайней мере избегает вызова метода. Но JIT собирается встроить это. Разница в производительности будет незначительной, если только она не находится в очень узком цикле.

Лично я нахожу секунду более читабельной (возможно, если вы назвали переменную чем-то иным, чем «temp»). Так что я бы проголосовал за это на этом основании. Но здесь я думаю, что это лучший вопрос: что яснее? Беспокойство по поводу производительности, когда у тебя есть основания полагать, что код имеет значение.

0 голосов
/ 03 августа 2011

Это вопрос с подвохом? Я бы предпочел вторую конструкцию, потому что она более читабельна и, вероятно, работает лучше.

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

0 голосов
/ 03 августа 2011

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

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