Задать вопрос
@Urukhayy

Какой вариант оптимальней?

if(a == 3)    CallMe();
if(b == 4) 
{
    CallMe();
    Giveme();
}


vs

if(a == 3 || b == 4)    CallMe();
if(b == 4) Giveme();


____________________________________________________________________

for(var i = 0, j = GetPool(); i <= j; i++)
    {
        CallFuncTo(i);
    }


vs

for(var i = GetPool(); i >= 0; i--)
    {
        CallFuncTo(i);
    }
  • Вопрос задан
  • 227 просмотров
Подписаться 1 Оценить Комментировать
Решения вопроса 1
Fesor
@Fesor
Full-stack developer (Symfony, Angular)
А что по вашему читается лучше?

для первого примера - второй вариант как более читабельный. Пусть лучше дублируется условие чем действие по этому условию.

По второму - как вам удобнее и если логика допускает реверс порядка.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
@MarkusD
все время мелю чепуху :)
По первому блоку:
switch( b )
{
case 4:
	GiveMe();
case 3:
	CallMe();
	break;
};

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

Касательно второго блока: предлагаю самостоятельно собрать в дебаге и релизе следующий код, да убедиться в сомнениях самому.
class A
{
public:
	inline size_t begin()
	{
		printf( "begin();\n" );
		return 0;
	};
	
	inline size_t end()
	{
		printf( "end();\n" );
		return 10;
	};
};

A cont;
for( size_t iter = cont.begin(); cont.end() > iter; ++iter )
{
	printf( "%d\n", iter );
};


Но тут всегда надо понимать, на какие траты допустимо идти ради удобства. Не стоит увлекаться вторыми переменными в объявлении for если тот же "end()" является легкой и оптимизируемой компилятором конструкцией. В этой связи советую уделить куда большее внимание области инкремента в "for".
Постфиксная форма всегда приводит к созданию временной переменной, префиксная - нет. Префиксные формы для счетчиков циклов в Google Code Style помечены как хорошая практика.
Ответ написан
Комментировать
Mrrl
@Mrrl
Заводчик кардиганов
В первом случае варианты не эквивалентны. При a=3, b=4 в первом варианте CallMe() вызовется дважды, а во втором - только один раз.
Первый вариант написан оптимально. Чтобы заставить его вести себя, как второй вариант (с одним вызовом CallMe()), достаточно вставить else:
if(a == 3)    CallMe();
else if(b == 4) {
    CallMe();
    Giveme();
}

Это будет оптимально по времени. Если же вместо CallMe() стоит более сложный вызов или длинный блок, и вас волнует длина кода (например, на микроконтроллере), то берите второй вариант. Если при этом и общее условие сложнее, чем b==4, то придётся его запомнить:
bool cond1=(sin(x)>=sin(y));
if(cond1 || cos(x)<cos(y)) Draw(tan(x),tan(y));
if(cond1) CloseLine();


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

Войдите, чтобы написать ответ

Похожие вопросы