Vous ne connaissez pas le secret de la fonction pensée et de la mémoire du code optimisé

Ce document est principalement utilisé pour examen rétrospectif et d'approfondir la compréhension

  • Tout d'abord, l'idée de la fonction récursive est très pratique dans la réalisation des fonctions, mais il est très performance des coûts, comme l'exemple suivant
	// 递归求阶乘
	function jieCheng_1(num) {
		if (num <= 1) {
			return 1; // 递归的出口
		}
		return num * jieCheng_1(num - 1); // 递归
	}
  • Peut être trouvé par l'écriture récursive, quand num> 2, la valeur calculée du nombre de fois num factoriel factoriel appel de fonction est requise: Le nombre d'appels, la valeur factoriel d'un appel de fonction factorielles + num-1 calculs requis

  • Ainsi, nous pouvons concevoir un espace tampon pour la valeur calculée de la factoriel SAUVEGARDÉES, par exemple, nous avons calculé le num-1 factoriel, et il sera enregistré dans l'espace tampon lors du calcul du num factoriel, juste à partir du cache Lire la valeur factorielle num-1, et la multiplication et num est le résultat de calcul

	// 递归求阶乘
	var cache = {}; // 缓存区
	function jieCheng_2(num) {
		var cacheItem = cache[num];
		if (cacheItem) {
	    	return cacheItem;
	    } else {
	    	return cache[num] = num <= 1 ? 1 : num * cache[num - 1];
	    }
	}
  • Nous continuons d'optimiser le cache peut être transformé en une caractéristique, l'utilisation de la privatisation de la fermeture de l'espace cache
	/* 缓存函数 */
	function memory(fn) {
	  var cache = {}; // 私有化缓存结构
	  return function () {
	    var key = arguments[0],
	      cacheItem = cache[key];
	    if (cacheItem) {
	      return cacheItem;
	    } else {
	      return cache[key] = fn.apply(this, arguments);
	    }
	  }
	}
  • Nous avons comparé dans le même ordre de grandeur l'efficacité des trois fonctions suivantes

    • jieCheng_1
    • jieCheng_2
    • memoryJieCheng
    console.time();
    jieCheng_1(10000);
    console.timeEnd();
    
    console.time();
    jieCheng_2(10000);
    console.timeEnd();
    
    console.time();
    memory(jieCheng_1)(10000);
    console.timeEnd();
    

    Insérer ici l'image Description

    • Mais attention: fermetures provoquent des fuites de mémoire (occupation), doit être mis en balance le coût du temps et le coût espace
Publié 49 articles originaux · éloge de won 29 · vues 1897

Je suppose que tu aimes

Origine blog.csdn.net/Brannua/article/details/104734504
conseillé
Classement