Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #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 и прерывает дальнейшие проверки после первого совпадения.

Хочу спросить у знающих и понимающих людей: мои рассуждения верны? И как дело будет обстоять на самом деле?
Ответить с цитированием
  #2 (permalink)  
Старый 04.09.2018, 12:55
Аватар для Aetae
Тлен
Отправить личное сообщение для Aetae Посмотреть профиль Найти все сообщения от Aetae
 
Регистрация: 02.01.2010
Сообщений: 6,584

После && код не выполнится если первые условие false, так что 1 и 2 - разницы нет.

Теоретически, чем меньше вложенность условий - тем быстрее. А на практике слишком много в разнообразных движках всяческих хитрых оптимизаций, и самый быстрый вариант зачастую далеко не очевиден. Потому только тестирование.
__________________
29375, 35
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Вопрос на миллион. Ajax и идентификация по адресной строке. 0931454574 AJAX и COMET 5 31.03.2011 11:54
Вопрос по замыканиям Goodfella Общие вопросы Javascript 20 09.03.2011 01:21
Вопрос по работе функций в PHP bayah Серверные языки и технологии 2 12.02.2011 17:42
Теоретический вопрос. gods33 (X)HTML/CSS 10 16.12.2010 23:49
вопрос о работе getElementById(id) gosha_kap Общие вопросы Javascript 1 17.07.2009 07:23