2013-03-07 1 views
0

Значение переменной счетчика будет 0 или 1 или 2 только«для цикла», который только один или два цикла. Это лучший вариант?

Ниже то, что я пытаюсь достичь Если счетчик равен 1, сделать что-то один раз, если его 2 сделать что-то в два раза

Это лучшее решение

 for(int j=0;j<count;j++){ 
      System.out.println("PRINTING..."); 
     } 

или это

 if(count==1){ 
      System.out.println("PRINTING..."); 
     }else if (count==2){ 
      System.out.println("PRINTING..."); 
      System.out.println("PRINTING..."); 
     } 

Я хотел бы знать, какой из них лучше и вес хй.

+2

Для петли лучше. Вы можете изменить требование в будущем и добавить счетчик 3+.Не хотите копировать вставку 'System.out ...' s и добавлять 'else-if's –

+1

Придерживаясь DRY (не повторяйте себя), я бы выбрал первый. – nhahtdh

+0

Под «лучше» вы на самом деле имеете в виду «быстрее»? –

ответ

4

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

1

Это зависит от фактических потребностей.

Если «что делать» всегда одно и то же для каждой итерации, очевидно, что цикл лучше.

Если это не так, то это зависит от характера различий, количества различий (например, есть ли один специальный случай, несколько особых случаев, могут быть вычислены особые случаи и т. Д.)

Это также важно, насколько расширяемы-без изменений вы хотите, чтобы код был.

1

Я предполагаю, что проблема заключается в производительности, поскольку с точки зрения читаемости кода и ремонтопригодности версия for-loop явно выигрывает от подавляющего преимущества.

Если код в теле цикла занимает столько же времени, сколько и вызов println, это не имеет значения.

Если тело петли было очень маленьким и быстрым, то основными затратами будут любые ошибочно предсказанные условные ветви или промахи в кеше. Если аппаратное обеспечение ошибочно считает следующую инструкцию после загрузки условной ветви в конвейер, она должна очистить весь конвейер после того, как ветвь достигнет стадии выполнения. Это действительно стоит.

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

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

Мое предположение заключается в том, что если есть измеримое различие, версия для цикла, скорее всего, будет быстрее. Это только предположение.

Если производительность вашей программы действительно зависит от того, как этот цикл написан, вы должны сравнить его. Из-за зависимости от тонкостей предсказания отраслевой ветви я предлагаю сравнить ваши программы с каждой версией на максимально возможном количестве различных процессоров. Если это недостаточно критично для производительности вашей программы, чтобы оправдать это усилие, придерживайтесь for-loop.

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