摘要:本文將講述源碼中,惰性求值的原理和實現。惰性求值中的參數直到需要時才會進行計算。執(zhí)行的示例圖如下惰性求值做法普通的做法存在一個問題每個方法各做各的事,沒有協調起來浪費了很多資源。
前言
lodash受歡迎的一個原因,是其優(yōu)異的計算性能。而其性能能有這么突出的表現,很大部分就來源于其使用的算法——惰性求值。
本文將講述lodash源碼中,惰性求值的原理和實現。
惰性求值(Lazy Evaluation),又譯為惰性計算、懶惰求值,也稱為傳需求調用(call-by-need),是計算機編程中的一個概念,它的目的是要最小化計算機要做的工作。
惰性求值中的參數直到需要時才會進行計算。這種程序實際上是從末尾開始反向執(zhí)行的。它會判斷自己需要返回什么,并繼續(xù)向后執(zhí)行來確定要這樣做需要哪些值。
以下是How to Speed Up Lo-Dash ×100? Introducing Lazy Evaluation.(如何提升Lo-Dash百倍算力?惰性計算的簡介)文中的示例,形象地展示惰性求值。
function priceLt(x) { return function(item) { return item.price < x; }; } var gems = [ { name: "Sunstone", price: 4 }, { name: "Amethyst", price: 15 }, { name: "Prehnite", price: 20}, { name: "Sugilite", price: 7 }, { name: "Diopside", price: 3 }, { name: "Feldspar", price: 13 }, { name: "Dioptase", price: 2 }, { name: "Sapphire", price: 20 } ]; var chosen = _(gems).filter(priceLt(10)).take(3).value();
程序的目的,是對數據集gems進行篩選,選出3個price小于10的數據。
1.1 一般的做法如果拋開lodash這個工具庫,讓你用普通的方式實現var chosen = _(gems).filter(priceLt(10)).take(3);那么,可以用以下方式:
_(gems)拿到數據集,緩存起來。
再執(zhí)行filter方法,遍歷gems數組(長度為10),取出符合條件的數據:
[ { name: "Sunstone", price: 4 }, { name: "Sugilite", price: 7 }, { name: "Diopside", price: 3 }, { name: "Dioptase", price: 2 } ]
然后,執(zhí)行take方法,提取前3個數據。
[ { name: "Sunstone", price: 4 }, { name: "Sugilite", price: 7 }, { name: "Diopside", price: 3 } ]
總共遍歷的次數為:10+3。
執(zhí)行的示例圖如下:
普通的做法存在一個問題:每個方法各做各的事,沒有協調起來浪費了很多資源。
如果能先把要做的事,用小本本記下來
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規(guī)行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/108344.html
摘要:函數式編程二拖延癥了好久,第二篇終于寫出來了。如果你對熟悉的話應該還記得,是可以調用來集中處理錯誤的對于函數式編程我們也可以做同樣的操作,如果運行正確,那么就返回正確的結果如果錯誤,就返回一個用于描述錯誤的結果。 JavaScript函數式編程(二) 拖延癥了好久,第二篇終于寫出來了。 上一篇在這里:JavaScript函數式編程(一) 上一篇文章里我們提到了純函數的概念,所謂的純函數...
摘要:函數式編程的哲學就是假定副作用是造成不正當行為的主要原因。函數組合面向對象通常被比喻為名詞,而函數式編程是動詞。尾遞歸優(yōu)化函數式編程語言中因為不可變數據結構的原因,沒辦法實現循環(huán)。 零、前言 說到函數式編程,想必各位或多或少都有所耳聞,然而對于函數式的內涵和本質可能又有些說不清楚。 所以本文希望針對工程師,從應用(而非學術)的角度將函數式編程相關思想和實踐(以 JavaScript 為...
摘要:函數是一等公民。其實閉包本身也是函數式編程的一個應用。劣勢不能算是嚴格意義上的函數式語言,很多函數式編程的特性并沒有。 隨著大前端時代的到來,在產品開發(fā)過程中,前端所占業(yè)務比重越來越大、交互越來越重。傳統(tǒng)的老夫拿起JQuery就是一把梭應付當下重交互頁面已經十分乏力。于是乎有了Angular,React,Vue這些現代框架。 但隨之而來的還有大量的新知識新名詞,如MVC,MVVM,Fl...
摘要:函數是一等公民。其實閉包本身也是函數式編程的一個應用。劣勢不能算是嚴格意義上的函數式語言,很多函數式編程的特性并沒有。 隨著大前端時代的到來,在產品開發(fā)過程中,前端所占業(yè)務比重越來越大、交互越來越重。傳統(tǒng)的老夫拿起JQuery就是一把梭應付當下重交互頁面已經十分乏力。于是乎有了Angular,React,Vue這些現代框架。 但隨之而來的還有大量的新知識新名詞,如MVC,MVVM,Fl...
摘要:同時還定義了接口,使得其下級可以從這里得到一個迭代器,對于該進行遍歷。迭代器在中也是一個約定的協議,實現該協議的對象要支持和兩個接口方法。從迭代器的邏輯中,可以看到,當對象作為其他的上級時,如果實現上傳下達。 背景:惰性求值? 來看一個 lazy.js 主頁提供的示例: var people = getBigArrayOfPeople(); var results = _.chain(...
閱讀 2022·2023-04-25 23:30
閱讀 1452·2021-11-24 10:18
閱讀 3069·2021-10-09 09:54
閱讀 2017·2021-10-08 10:05
閱讀 3431·2021-09-23 11:21
閱讀 3161·2019-08-30 15:52
閱讀 1560·2019-08-30 13:05
閱讀 1056·2019-08-30 13:02