Показать сообщение отдельно
  #43 (permalink)  
Старый 07.08.2017, 19:05
Аватар для Белый шум
Профессор
Отправить личное сообщение для Белый шум Посмотреть профиль Найти все сообщения от Белый шум
 
Регистрация: 19.01.2012
Сообщений: 505

Немного поковырял этот 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 не будет никакой пользы
Ответить с цитированием