Langou簡介
Langou是一個跨平臺(Android/iOS)前端開發框架,核心代碼使用C++編寫,底層基於OpenGL繪圖,上層實現了一個精簡的排版引擎以及一個JS/JSX運行環境。目標是想實現在此基礎上開發GUI應用程序可兼顧開發速度與運行效率。
Benchmark
在iPhone6
上創建10萬個Div並對相關屬性進行設置需要10秒以上的時間,但在Android
上這個時間會減少到1/2,
因爲Android
使用的V8,而iOS上是使用的JSC
並通過膠水層粘合到V8
的API,所以JS性能不如Android
。
對於2d繪圖GPU不是主要瓶頸,主要瓶頸集中在CPU,但可優化的空間還很大。
測試主要集中在圖形方面,這包括JS調用API的時間開銷,圖形繪製的幀率,CPU的運行百分佔比。對於文件IO以以及網絡方面的測試相對比較少,因爲庫IO本身是基於NodeJS
基本沒有任何改動。
下面的數據是對iPhone6
、 Google Nexus6
、iPad mini2
的測試結果。
- 注意下面的時間單位都爲毫秒,CPU佔比以單核爲準100%表示一個CPU核心滿載運行。
- 還有一點需要注意在屏幕沒有任何變化時,CPU佔用一般爲1%左右。
View
在一個全屏Scroll視圖中創建10萬個Div視圖,然後滾動這個Scroll,這時查看CPU佔比以及頻幕刷新率。
Div視圖是自動佈局的,所以10萬個Div不會在屏幕中同時出現。這主要測試Dom的操作、視圖排版佈局、以及繪圖性能。
設備 | Div數量 | 創建時間 | Fsp | CPU佔比 |
---|---|---|---|---|
iPhone6 | 10000 | 1257 | 60 | 45% |
Nexus6 | 10000 | 670 | 60 | 48% |
iPad mini2 | 10000 | 1269 | 60 | 60% |
iPhone6 | 20000 | 2457 | 60 | 58% |
Nexus6 | 20000 | 1265 | 60 | 70% |
iPad mini2 | 20000 | 2460 | 60 | 90% |
iPhone6 | 50000 | 6162 | 48 | 97% |
Nexus6 | 50000 | 2987 | 39 | 97% |
iPad mini2 | 50000 | 5959 | 42 | 97% |
iPhone6 | 100000 | 12647 | 25 | 97% |
Nexus6 | 100000 | 5859 | 20 | 97% |
iPad mini2 | 100000 | 11964 | 22 | 97% |
- 這是iPhone6截圖:
- 下面是主要的測試源碼:
new GUIApplication({ multisample: 2 }).start(
<Root backgroundColor="#000">
<Scroll width="full" height="full">
${
Array.from({length:100000}, ()=>{
var color = new Color(random(0, 255),
random(0, 255), random(0, 255), 255);
return <Div backgroundColor=color class="item" />;
})
}
</Scroll>
</Root>
)
Action
在同一屏幕隨機創建4000個視圖,並隨機設置旋轉動作,這時查看CPU佔用,與屏幕刷新率。這主要測試動作系統性能、同屏繪圖性能,以及設備的CPU與GPU的性能。CPU佔比越低幀數越高表示性能越好。
可
設備 | 數量 | Fsp | CPU佔比 |
---|---|---|---|
iPhone6 | 1000 | 60 | 54% |
Nexus6 | 1000 | 60 | 65% |
iPad mini2 | 1000 | 60 | 90% |
iPhone6 | 2000 | 60 | 98% |
Nexus6 | 2000 | 40 | 110% |
iPad mini2 | 2000 | 40 | 88% |
iPhone6 | 4000 | 30 | 104% |
Nexus6 | 4000 | 20 | 110% |
iPad mini2 | 4000 | 25 | 104% |
從數據上可以看出Nexus6的單核CPU性能不如iPhone6。
- 下面是iPhone6截圖:
CSS
創建10萬個樣式表所消耗的時間。
設備 | 創建時間 |
---|---|
iPhone6 | 14699 |
Nexus6 | 10381 |
iPad mini2 | 14808 |
這裏與Dom操作很類似時間有點長,這是因爲對屬性值的解析是通過調用JS方法完成,如果這個過程在Native中,這個時間會減少很多,這也是以後的版本所需要解決的問題。
Storage
下面分別是調用20萬次storage.set()
、20萬次storage.get()
、20萬次storage.del()
消耗的時間。
設備 | set() | get() | del() |
---|---|---|---|
iPhone6 | 4381 | 3821 | 3547 |
Nexus6 | 7178 | 6539 | 6567 |
iPad mini2 | 4951 | 4256 | 4179 |
End
上面的數據只能做大體參考,對這種GUI框架的測試我現在還沒有找到比較好的標準。