Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #41 (permalink)  
Старый 04.12.2015, 14:03
Профессор
Посмотреть профиль Найти все сообщения от Mаxmaxmаximus
 
Регистрация: 29.10.2015
Сообщений: 473

Сообщение от alex.vv
Мне одному кажется странным, что при десятикратном увеличении количества итераций время asm time не поменялось ни на йоту?
оптимизация компилятора, если сделать какие то более сложные вычисления в цикле, например алгоритм "поворот стрелки часов по кругу", то оптимизатор выключается и цикл отрабатывает как положено
Ответить с цитированием
  #42 (permalink)  
Старый 04.12.2015, 14:04
Профессор
Посмотреть профиль Найти все сообщения от Mаxmaxmаximus
 
Регистрация: 29.10.2015
Сообщений: 473

Сообщение от webgame
Да я уж понял, что ты тут местный дурачек
https://ru.wikipedia.org/wiki/Ad_hominem

Нет я доказал что я не дурачек а наоборот умный человек, а вот ты доказал что ты дурачек) А я местный гений. Не путай себя и меня, амёба я тебя слил и наоброт доказал что я ПРАВ а ты НЕ прав. Где же тут чт я дурачек? тут все наоброт ЖЕ, это ТЫЫЫ дурачек а не я))
Ответить с цитированием
  #43 (permalink)  
Старый 07.08.2017, 19:05
Аватар для Белый шум
Профессор
Отправить личное сообщение для Белый шум Посмотреть профиль Найти все сообщения от Белый шум
 
Регистрация: 19.01.2012
Сообщений: 498

Немного поковырял этот asm.js. В результате написал пару тестовых ф-ий, плюс аналогичные на простом javascript для сравнения производительности (отличаются только строкой "use asm"; для чистоты эксперимента):

function asm(stdlib, foreign, buffer){
	"use asm";

	function hello(name, cycle=false){
		var name2 = "";
		if( cycle ) {
			for(var i=0; 50000000>i; i++ ){
				name2 = "Привет, " + name + ". Съешь ещё этих мягких французских булочек да выпей чаю!";
			}
		} else {
			name2 = "Привет, " + name + ". Съешь ещё этих мягких французских булочек да выпей чаю!";
		}
		return name2;
	}

	function sum(s1, s2, cycle=false){
		s1 = s1|0;
		s2 = s2|0;
		var ret = 0|0;
		if( cycle ) {
			for(var i=0; 50000000>i; i++ ){
				ret = (s1 + s2)|0;
			}
		} else {
			ret = (s1 + s2)|0;
		}
		return ret;
	}

	return { hello: hello, sum: sum }
}

function js(stdlib, foreign, buffer){

	function hello(name, cycle=false){
		var name2 = "";
		if( cycle ) {
			for(var i=0; 50000000>i; i++ ){
				name2 = "Привет, " + name + ". Съешь ещё этих мягких французских булочек да выпей чаю!";
			}
		} else {
			name2 = "Привет, " + name + ". Съешь ещё этих мягких французских булочек да выпей чаю!";
		}
		return name2;
	}

	function sum(s1, s2, cycle=false){
		s1 = s1|0;
		s2 = s2|0;
		var ret = 0|0;
		if( cycle ) {
			for(var i=0; 50000000>i; i++ ){
				ret = (s1 + s2)|0;
			}
		} else {
			ret = (s1 + s2)|0;
		}
		return ret;
	}

	return { hello: hello, sum: sum }
}


var test_asm = asm(window, null, null);
var test_js = js(window, null, null);


console.info("---- Цикл внутри функций ----");

console.time('asm-hello-cycle');
test_asm.hello("Вася", true);
console.timeEnd('asm-hello-cycle');

console.time('js-hello-cycle');
test_js.hello("Вася", true);
console.timeEnd('js-hello-cycle');


console.time('asm-sum-cycle');
test_asm.sum(5000, 10000, true);
console.timeEnd('asm-sum-cycle');

console.time('js-sum-cycle');
test_js.sum(5000, 10000, true);
console.timeEnd('js-sum-cycle');


console.info("---- Функции вызываются в цикле ----");

console.time('asm-hello');
for(var i=0; 50000000>i; i++ ){
	test_asm.hello("Вася");
}
console.timeEnd('asm-hello');

console.time('js-hello');
for(var i=0; 50000000>i; i++ ){
	test_js.hello("Вася");
}
console.timeEnd('js-hello');


console.time('asm-sum');
for(var i=0; 50000000>i; i++ ){
	test_asm.sum(5000, 10000);
}
console.timeEnd('asm-sum');

console.time('js-sum');
for(var i=0; 50000000>i; i++ ){
	test_js.sum(5000, 10000);
}
console.timeEnd('js-sum');

console.info("--------");


Типичный результат на моём компьютере в хроме:
Код:
---- Цикл внутри функций ----
asm-hello-cycle: 3100.053955078125ms
js-hello-cycle: 3169.260986328125ms
asm-sum-cycle: 35.586181640625ms
js-sum-cycle: 204.694091796875ms
---- Функции вызываются в цикле ----
asm-hello: 3874.47705078125ms
js-hello: 2499.636962890625ms
asm-sum: 805.5888671875ms
js-sum: 192.636962890625ms
--------
Выводы:
  • asm.js оптимизирует только математические функции;
  • строковый тип вообще отсутствует (пока?). В результате выигрыш на операциях со строками у asm.js настолько мал, что иногда даже показывает результат хуже чем на js (видимо влияют внешние факторы);
  • вызов ф-ии asm.js очень дорогой, имеет смысл использовать только при большом кол-ве математических действий внутри неё;

В общем, на моих сайтоклепательских задачах от asm.js не будет никакой пользы
Ответить с цитированием
Ответ



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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
ASM.JS. манипуляция c DOM. Tsamsiyu Общие вопросы Javascript 0 10.11.2014 15:05
ASM.JS. Источники знаний. Tsamsiyu Общие вопросы Javascript 35 08.11.2014 18:53
Chrome + opera +firefox поддерживают ASM.JS DjDiablo Оффтопик 1 13.12.2013 10:14