如何理解楊博老師對 DOM 操作複雜度的評論?

傳送門: Vue 中如何使用 MutationObserver 做批量處理?

這是在釣魚嗎?還是在天然呆?


修改3次數據,就更新3次dom,不就是O(n)?

修改3次數據,binding.scala只改一次dom?

O(3) 是什麼東西?常數複雜度不都表示成O(1)?

虛擬dom做diff的時候,可以用一些技巧做高效的剪枝,所以改一次數據就做一次diff+patch,也不見得有多大開銷。

binding.scala確實有可取之處,值得了解借鑒。不過看作者之前一些文章,對react的看法不敢苟同。


楊博又不是曾博 ...

曾博才喜歡這麼釣魚,明明講的都是對的,非要故意搞個破綻出來,引你上鉤。釣魚技術不斷進步,有目共睹。從小勃勃時期,單問題釣魚,被叛逆者無視。到勃失敗時期,發展出多問題釣魚的新套路,叛逆者終於上鉤了。

楊博這裡是稀里糊塗的把3當成了變數來用,不符合大眾的直覺。不過這好像和曾博也沒啥區別了,當曾博說三本的時候,表達的也是O(n)的意思。

(逃


截圖那段話的語境是在討論Vue的批處理機制。話確實是我沒說清楚。我現在舉個例子解釋一下:

比如說有個組件裡面有n個HTML元素,用戶每點一次滑鼠需要修改上游數據k次,並在這n個HTML元素中修改k處。請問使用不同框架時,時間複雜度分別是多少?(不考慮瀏覽器渲染時間,只算JavaScript代碼執行時間)

已知虛擬DOM diff的複雜度是O(n)。

假如每次修改上游數據就觸發一次diff計算,要是觸發k次的話,複雜度是O(n*k)。

所以Vue搞了個批處理機制,在一幀內修改上游數據k次,一共只diff一次,總複雜度是O(k+n)而不是O(n*k)。

而Binding.scala的時間複雜度是O(k)。這是理論上最低的複雜度,因為無論如何,最終也至少需要調用k次DOM操作。

這裡有個大前提是n&>k,我那個帖子是把k當成3來舉例說明。


看到這個O(3),我不禁陷入了深深的沉思……


不止楊博批了這種批處理做法吧,綁定你看看 mobx…


他不就是SICP扉頁上提到的"傳道士"么,不管什麼問題都要宣傳一下Binding.scala,然後再黑一下別的。


某人知不知道大 O 啥定義啊


筒子們,這是傳說中的「序員相輕」啊


馬雲有1500億。中國有13億人 他每人發一億 他還有1487億!


推薦閱讀:

面試系列之四:你真的了解React嗎(下)Flux與Vuex的差異以及Webpack的工作原理
【譯】也許你不必使用 Redux
推薦閱讀-第4期

TAG:前端開發 | Scala | 演算法複雜度 |