瀏覽器性能

瀏覽器是怎麼渲染的?

DOM樹+CSS規則樹—>渲染樹—調用系統GUI的API來繪製頁面
1)瀏覽器下載html文件之後,會根據html文件構建DOM樹,其中css會構建css規則樹,js會修改dom樹和css規則樹;
2)通過計算css樣式,形成渲染樹,然後進行佈局和繪製頁面;
3)CSS文件要放在頂部,JS文件要放在底部。因爲當CSS文件放在頂部時,頁面會逐步呈現,有較好的用戶體驗,如果將CSS文件放在底部,瀏覽器爲了避免迴流,會阻塞內容的呈現。可能導致白屏和內容閃爍的情況。JS文件要放在底部是因爲JS文件可能對DOM樹進行修改,所以瀏覽器在加載JS文件時是阻塞的。而其他文件都可以並行下載。JS文件如果放在頂部會阻塞內容的逐步呈現,並且阻塞後面組件的下載。
4)迴流reflow和重繪repaint
由於html默認採用的是流式佈局,所以當元素的幾何尺寸發生變化時,會產生迴流。迴流會從當前元素遞歸往下重新計算元素的位置。比如說對DOM進行增、刪、改、移動或者動畫、還有resize時都會觸發迴流reflow。
而當元素幾何尺寸沒有發生變化,僅僅是顏色和背景色發生變化時,會產生重繪。
瀏覽器會對某些操作進行異步迴流
避免迴流:不要一條一條修改樣式,可以預先定義好class的css然後修改類名;對DOM進行離線修改;儘量修改層級較低的DOM;爲動畫的組件採用非流式佈局;不使用table佈局;

瀏覽器的組件

  • 用戶界面 用戶界面包含了地址欄,前進後退按鈕,書籤菜單等等,除了請求頁面之外所有你看到的內容都是用戶界面的一部分
  • 瀏覽器引擎 瀏覽器引擎負責讓 UI 和渲染引擎協調工作
  • 渲染引擎 渲染引擎負責展示請求內容。如果請求的內容是 HTML,渲染引擎會解析 HTML 和 CSS,然後將內容展示在屏幕上
  • 網絡組件 網絡組件負責網絡調用,例如 HTTP 請求等,使用一個平臺無關接口,下層是針對不同平臺的具體實現
  • UI後端 UI 後端用於繪製基本 UI 組件,例如下拉列表框和窗口。UI 後端暴露一個統一的平臺無關的接口,下層使用操作系統的 UI 方法實現
  • Javascript 引擎 Javascript 引擎用於解析和執行 Javascript 代碼
  • 數據存儲 數據存儲組件是一個持久層。瀏覽器可能需要在本地存儲各種各樣的數據,例如 Cookie 等。瀏覽器也需要支持諸如 localStorage,IndexedDB,WebSQL 和 FileSystem 之類的存儲機制

垃圾回收

原理:找出不再使用的變量,然後釋放其佔用的內存(垃圾收集器週期性地執行)
垃圾回收
方法:

  1. 標記清除:目前主流的垃圾收集算法,將當前不使用的值加上標記,然後進行內存回收。(通過變量在執行環境中的生存週期)
  2. 引用計數:記錄所有值被引用的次數,當引用次數爲0時,進行內存回收。存在的問題:循環引用會導致內存泄露。所以最好手動解除引用。

說明:

  1. 在標記清除時,如何確定變量不再被使用?

JS中分爲全局執行環境和函數的執行環境,代碼運行時,會先將全局執行環境壓入棧中,然後當執行流進入函數時,會創建函數的執行環境和相應的作用域鏈。
每個函數都有自己的執行環境,對應着相應的作用域鏈。對變量的查找和賦值都沿着自己的作用域鏈向上查找。
創建函數時,會創建一個預先包含全局變量對象的作用域鏈;當執行函數時,會創建本地活動對象(包括arguments和局部變量),並將其推入作用域鏈前端。當執行函數時,對變量的查找會沿着作用域鏈向上搜索,直到作用域鏈的最頂端—全局變量對象。當函數執行完畢後,本地活動對象會在內存中銷燬。而閉包中,當外層函數執行完畢後,外層函數的作用域鏈被銷燬,但被閉包函數引用的活動對象還存在內存中。
不確定:任何函數(包括閉包函數)在執行完畢後,只能銷燬本地活動對象,所以爲了銷燬閉包引用的活動對象,需要銷燬閉包函數,即解除引用null。

  1. 如何引用計數?

將引用類型值賦給已聲明的變量,引用計數加1,若該變量的值變爲了其他,則引用計數值減1。當引用計數爲0時,進行內存回收。

自我理解代碼執行過程:將全局執行環境推入執行棧中,將所有var 變量和函數聲明提升到其作用域的頂部,創建函數時,會創建一個預先包含全局變量對象的作用域鏈;然後從第一行代碼開始順序執行,所有函數都會當函數執行時,則將函數的執行環境推入棧中,並形成其作用域鏈,函數在聲明時會形成一個包含全局對象的作用域鏈,當函數執行時,會將當前活動對象加入到作用域鏈中,對變量的查找都是沿着作用鏈進行查找的。

性能問題:垃圾收集器的執行間隔:IE6根據內存分配量運行,當內存量大時,一般整個程序所需要的內存量就很大,這樣會造成垃圾收集器的頻繁執行。IE7重寫了之後採用的規則:觸發垃圾收集的臨界值動態變化。初始觸發垃圾收集的臨界值與IE6相同,若回收的內存分配量低於15%,則臨界值加倍;若回收的內存分配量大於85%,則臨界值保持不變。

google V8引擎

V8內存回收
V8優化技術及注意事項

瀏覽器內核有哪些

IE(Trident);firefox(Gecko);Safari和chrome(WebKit);Opera(Presto)

gbk與utf-8

GBK、Unicode、ASCII碼 都爲字符集,UTF-8爲編碼方式;
ASCII碼一共規定了128個字符的編碼;
GBK包含全部中文字符;2個字節表示中文;
unicode 中所有符號都全球唯一;
UTF-8作爲Unicode的實現方式之一,包含全世界所有國家需要用到的字符。一個字節表示英文,3個字節表示中文。UTF8佔用的數據庫比GBK大。

更多博客:https://github.com/Lmagic16/blog

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章