Показать сообщение отдельно
  #1 (permalink)  
Старый 04.09.2018, 11:03
Новичок на форуме
Отправить личное сообщение для Лоэнрон Посмотреть профиль Найти все сообщения от Лоэнрон
 
Регистрация: 24.07.2018
Сообщений: 8

Вопрос по работе интерпритатора
Доброго времени!
Тема, скорее всего, не совсем верно подобрана. Я относительно новичок в JavaScript, и сегодня меня заинтересовал такой вопрос:
Вот есть код, выполняющий, в принципе, одно и тоже действие. Структурно он представляет собой сравнение определенных значений (подробности не так важны) и выполнение действия. Но я смог представить его аж в 3-х разных видах. Суть сейчас не в самом коде (да, я не учитываю 0 и т.д.), а именно в способе представления, т.е. какой, именно с точки зрения машины, код будет выполнятся быстрее. Попрошу от ответов, вроде "Современным машинам все-равно, разница в миллисекундах" или "Вопрос тупой" воздержаться.
Это в подобной простой задаче нет разницы, как представлять, но в боевых тяжелых условиях, 10 задач выполняемых на 10 миллисекунд каждая раньше, дает уже 100 миллисекунд. 100 задач - уже целую секунду.

Собственно, сам код:
Вариант 1, самый читаемый для человека, на основе которого я уже представлял остальные варианты:
if(
	        (point_2.x - point_1.x) > 0 &&
		(point_2.y - point_1.y) > 0 &&
		(point_2.x - point_1.x) > (point_2.y - point_1.y)
	){
		drawCircle(0);
	}
	if(
		(point_2.x - point_1.x) > 0 &&
		(point_2.y - point_1.y) > 0 &&
		Math.abs(point_2.x - point_1.x) < Math.abs(point_2.y - point_1.y)
	){
		drawCircle(1);
	}
	if(
		(point_2.x - point_1.x) < 0 &&
		(point_2.y - point_1.y) > 0 &&
		Math.abs(point_2.x - point_1.x) < Math.abs(point_2.y - point_1.y)
	){
		drawCircle(2);
	}
	if(
		(point_2.x - point_1.x) < 0 &&
		(point_2.y - point_1.y) > 0 &&
		Math.abs(point_2.x - point_1.x) > Math.abs(point_2.y - point_1.y)
	){
		drawCircle(3);
	}
	if(
		(point_2.x - point_1.x) < 0 &&
		(point_2.y - point_1.y) < 0 &&
		Math.abs(point_2.x - point_1.x) > Math.abs(point_2.y - point_1.y)
	){
		drawCircle(4);
	}
	if(
		(point_2.x - point_1.x) < 0 &&
		(point_2.y - point_1.y) < 0 &&
		Math.abs(point_2.x - point_1.x) < Math.abs(point_2.y - point_1.y)
	){
		drawCircle(5);
	}
	if(
		(point_2.x - point_1.x) > 0 &&
		(point_2.y - point_1.y) < 0 &&
		Math.abs(point_2.x - point_1.x) < Math.abs(point_2.y - point_1.y)
	){
		drawCircle(6);
	}
	if(
		(point_2.x - point_1.x) > 0 &&
		(point_2.y - point_1.y) < 0 &&
		Math.abs(point_2.x - point_1.x) > Math.abs(point_2.y - point_1.y)
	){
		drawCircle(7);
	}

Вариант 2, менее читаемый.
if( (point_2.x - point_1.x) > 0 ){
		if( (point_2.y - point_1.y) > 0 ){
			if( Math.abs(point_2.x - point_1.x) > Math.abs(point_2.y - point_1.y) ){
				drawCircle(0);
			} else if ( Math.abs(point_2.x - point_1.x) < Math.abs(point_2.y - point_1.y) ) {
				drawCircle(1);
			}
		} else if ( (point_2.y - point_1.y) < 0 ) {
			if( Math.abs(point_2.x - point_1.x) > Math.abs(point_2.y - point_1.y) ){
				drawCircle(6);
			} else if ( Math.abs(point_2.x - point_1.x) < Math.abs(point_2.y - point_1.y) ) {
				drawCircle(7);
			}
		}
	} else if ( (point_2.x - point_1.x) < 0 ){
		if( (point_2.y - point_1.y) > 0 ){
			if( Math.abs(point_2.x - point_1.x) > Math.abs(point_2.y - point_1.y) ){
				drawCircle(3);
			} else if ( Math.abs(point_2.x - point_1.x) < Math.abs(point_2.y - point_1.y) ) {
				drawCircle(2);
			}
		} else if ( (point_2.y - point_1.y) < 0 ) {
			if( Math.abs(point_2.x - point_1.x) > Math.abs(point_2.y - point_1.y) ){
				drawCircle(4);
			} else if ( Math.abs(point_2.x - point_1.x) < Math.abs(point_2.y - point_1.y) ) {
				drawCircle(5);
			}
		}
	}

Ну и третий вариант:
var code = "";
	
	if( (point_2.x - point_1.x) > 0 ){
		code += 1;
	} else if( (point_2.x - point_1.x) < 0 ) {
		code += 0;
	}
	if( (point_2.y - point_1.y) > 0 ){
		code += 1;
	} else if( (point_2.y - point_1.y) < 0 ) {
		code += 0;
	}
	if( Math.abs(point_2.x - point_1.x) > Math.abs(point_2.y - point_1.y) ){
		code += 1;
	} else if( Math.abs(point_2.x - point_1.x) < Math.abs(point_2.y - point_1.y) ) {
		code += 0;
	}
	
	switch(code){
		case ("111"):
			drawCircle(0);
			break;
		case ("110"):
			drawCircle(1);
			break;
		case ("010"):
			drawCircle(2);
			break;
		case ("011"):
			drawCircle(3);
			break;
		case ("001"):
			drawCircle(4);
			break;
		case ("000"):
			drawCircle(5);
			break;
		case ("100"):
			drawCircle(6);
			break;
		case ("101"):
			drawCircle(7);
			break;
	}


Я рассуждаю как:
JS же вроде как жадный, т.е. проверяя условия, после первого несовпадения он перестанет проверять дальше, т.е. получается самым эффективным будет второй вариант.

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

Третий будет самым неэффективным, т.к. создается дополнительная переменная, и в итоге сравнений гораздо больше, хотя switch и прерывает дальнейшие проверки после первого совпадения.

Хочу спросить у знающих и понимающих людей: мои рассуждения верны? И как дело будет обстоять на самом деле?
Ответить с цитированием