Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Function Cache (https://javascript.ru/forum/misc/52176-function-cache.html)

melky 08.12.2014 01:09

Цитата:

Сообщение от krutoy
Любая функциональщина -- это дрочево под оптимизатор

похоже , что у нас тут типичное неприятие нового
Цитата:

Сообщение от bes
сколько у вас часов в сутках?

раньше было около тысячи , сейчас - такое чувство, что в сутках 6 часов, не больше

но раньше сутки были длиннее, да

krutoy 08.12.2014 03:31

Цитата:

Сообщение от nerv_
мой полный ответ был здесь.

И заметь, что так называемый "твой ответ" появился уже после того, как я тебя ткнул лицом в это говно. А ты должен был не отвечать бесу, а в первом же посте указать на эти ограничения ТСу. Но ты этого не сделал по той причине, что пока я тебя не ткнул в твое говно, ты об этом и не думал и не знал. А вместо спасибо, ты начал борзеть, и именно по этой причине окончательно был слит в гавно.

nerv_ 08.12.2014 10:12

krutoy, припекло тебя :D

Цитата:

Сообщение от krutoy
А ты должен был

я никому ничего не должен :)

Я показал свою реализацию, которой мне хватает более чем. Да, у нее есть ограничения. Если тот, кто ее использует не способен их увидеть - это его проблемы)

Цитата:

Сообщение от krutoy
как я тебя ткнул лицом в это говно

Пожалуйста, не тяни меня в свое говно, в кот. ты плаваешь постоянно. Ты сделан из него, им пропитан, плохо воспитан и, вообще, говорить с тобой мне не о чем. Не сейчас, не в будущем.

Erolast 08.12.2014 10:26

Цитата:

Не сейчас, не в будущем.
Ни.

nerv_ 08.12.2014 10:35

вот оно че, Михалыч
комментарии излишни)

bes 08.12.2014 19:51

Цитата:

Сообщение от krutoy
Слушай, честно, мне лень разбирать примеры "вечного двигателя". Понять бессмысленность данной затеи легко. Смотри. В JS объект получается по ссылке. Легко понять, что закэшировать его можно только одним способом -- сохранив ссылку на него в кэше. Естественно, если объект меняется, то из кэша ты получаешь неактуальные значения. Этого понимания достаточно, чтобы прекратить эти нелепые попытки
Но это не значит, что мы не можем кэшировать какие то частные случаи. Например, можно часть объектов сделать неизмняемыми. чтоб они работали как простые хэши, можно работать с примитивами, не вызывая их в объектном контексте, и т.п. Это сделать легко.

смотри: есть объект, есть его состояние, кешируем ссылку на объект и его состояние, если ни ссылка, ни состояние не изменилось, можно обращаться к кешу
в моём последнем примере как раз так и делается, с учётом того, что ссылку сохранить не проблема, а сохранение состояния можно реализовывать с различной степенью сложности

krutoy 08.12.2014 20:33

bes,
Не взрывай мне мозг :)
function f(obj) {
    return obj.a + obj.b;
}
 
function isSame(args1, args2) {
    var len1 = args1.length;
    var len2 = args2.length;
    if ( len1 != len2 ) return false;
    for (var i = 0; i < len1; i++) {
        if ( args1[i] === args2[i] ) continue;
        return false;
    }
    return true;
}
 
function cacheFn(fn) {
    var cache = [];
    return function () {
        var len = cache.length;
        for (var i = 0; i < len; i++) {
            if ( isSame(cache[i].args, arguments) && JSON.stringify(arguments) == cache[i].strArg) {
                console.log("cache: " + cache[i].res + "\n\n");
                return cache[i].res;
            }
        }
        cache.push( {args: arguments, strArg: JSON.stringify(arguments), res: fn.apply(this, arguments)} );
        console.log("call: " + cache[len].res + "\n\n")
        return cache[len].res;
    }
}
 
var cacheF = cacheFn(f);
o={b: 2}
var o1 = Object.create(o)
o1.a = 1
cacheF(o1);
 
o.b=10
console.log("----");
cacheF(o1);
 
console.log("****");
 
cacheF(o1);
//  call: 3
//  
//  
//  ----
//  cache: 3
//  
//  
//  ****
//  cache: 3

bes 08.12.2014 22:43

Цитата:

Сообщение от krutoy
bes,
Не взрывай мне мозг :)

лови fuel injection, possibly with slices of shit :D
ещё куча непокрытого, но твой случай покрывает :)
function type(el) {
	var type = typeof el;
	if ( type != "object" ) return type;
	if ( el == null ) return "null";
	if ( el.length || el.length >= 0 ) return "array";
	return "object";
}

function len(obj) {
	var n = 0;
	for (var key in obj) {
		n++;
	}
	return n;
}

function isEqual(obj1, obj2) {
	if ( type(obj1) != "object" && type(obj2) != "object" ) return obj1 == obj2;
	if ( len(obj1) != len(obj2) ) return false;
	for (var key in obj1) {
		if (obj1[key] === obj2[key]) {
			continue;
		}
		return false;
	}
	return true;
}

function cloneObject(obj) {
	var clone = {};
	for (var key in obj) {
		clone[key] = obj[key];
	}
	return clone;
}

function isSame(args1, args2) {
	var len1 = args1.length;
	var len2 = args2.length;
	if ( len1 != len2 ) return false;
	for (var i = 0; i < len1; i++) {
		if ( isEqual(args1[i], args2[i]) ) continue;
		return false;
	}
	return true;
}

function giblets(args) {
	var giblet = [];
	var length = args.length;
	for ( var i = 0; i < length; i++ ) {
		if ( type(args[i]) != "object" ) {
			giblet.push(args[i]);
		} else {
			giblet.push( cloneObject(args[i]) );
		}
	}
	return giblet;
}

function cacheFn(fn) {
	var cache = [];
	return function () {
		var len = cache.length;
		for (var i = 0; i < len; i++) {
			if ( isSame(cache[i].args, giblets(arguments)) ) {
				console.log("cache: " + cache[i].res + "\n\n");
				return cache[i].res;
			}
		}
		cache.push( {args: giblets(arguments), res: fn.apply(this, arguments)} );
		console.log("call: " + cache[len].res + "\n\n")
		return cache[len].res;
	}
}


function f(obj) {
	return obj.a + obj.b;
}

var cacheF = cacheFn(f);
o={b: 2}
var o1 = Object.create(o)
o1.a = 1
cacheF(o1);
cacheF(o1);
 
o.b=10
console.log("----");
cacheF(o1);
cacheF(o1);

Vlasenko Fedor 09.12.2014 00:03

krutoy,
function isSame(args1, args2) {
    var len1 = args1.length;
    var len2 = args2.length;
    if ( len1 != len2 ) return false;
    for (var i = 0; i < len1; i++) {
        if ( args1[i] === args2[i] ) continue;
        return false;
    }
    return true;
}

и
function isSame(args1, args2) {
    return args1 === args2;
}

Это напомнило мне прошлую неделю. Задание было переписать самописный ACl в самописном движке.
Час я смотрел на этот код и не мог понять, что здесь было написано. Я хотел понять мысль того разработчика который это написал. Это был запрос на пол-страницы , пришлось и по гуглить так как некоторые операторы я встретил впервые, а также много рекурсивных функций. Копаться в этом дерьме не было особого интереса. Решение было интересное. Пару проведенных тестов подача одних параметров на вход привело к очевидности к замене 300 строк кода 3 строками. Тестировщик позже подтвердил правильность решения.

В общем к чему я. Приведенный в начале топика код напоминает напоминает шаблон Реестр (Registry)

krutoy 09.12.2014 07:30

Poznakomlus,
Да, но ваша ассоциация, кстати, не совсем к месту:). Все таки "выяснить, указывают ли 2 ссылки на один и тот же объект(массив)" и "имеют ли 2 объекта (массива) идентичную структуру" это далеко не одно и то же.


Часовой пояс GMT +3, время: 10:36.