https://blog.qt.io/blog/2013/04/15/evolution-of-the-qml-engine-part-1/
這一系列 QML engine 的文章(其實目前也只有一篇….)深入探討了 QML engine 的內部運作機制。Lars Knoll 指出了目前 QML engine 比較大的問題包括:
- Several object models
- 也就是一個 QML item 必需有3個object models,分別存在於 V8 engine, QML engine, Native Qt (以QObject 形式存在),不但耗費很多記憶體,要 sync 三個物件的值也是一大工程
- Bindings done through JS closures
- 每個 property binding 都是一個 JS closure,因此要先重新把 binding expression 重組成 JS closure,然後 V8 再 parsing 一次這個 closure。很慢,因此提出了一個輕量、快速的 V4 engine 來幫忙處理簡單的 expression(這也是為什麼官方的 performance tuning 文件叫你要盡量簡單化 binding expression)。
- Data type conversions
- Qt 跟 V8 之間的 data type 轉換很花時間,此外如果是 string 的話,memory copy 的成本也不低。當然,有些改善方法,但那就是拿記憶體或程式複雜度換來的了
- QML scoping rules
- QML element 實際上是樹狀結構,跟傳統的 JS engine 其實不大一樣,QML engine 用了很複雜的方法來處理這段(through nesting slow and deprecated with() statements)。
- Throwing away QML type info
- type info 會被丟棄..
- iOS and WinRT support
- V8要求系統記憶體可以被設定成 executable,但這在iOS及WinRT是做不到的…所以只能另外做一套 JS engine 了..
- Working with upstream V8
- Qt 裡面的 V8 跟標準版的 V8 程式碼已經差很多了..而且好像很難 merge 了…
其中第2.點提到了 V4 engine,但是它在 5.4 的時侯,因為手誤,所以預設是沒有開啟 JIT 的(https://bugreports.qt.io/browse/QTBUG-43171),因此效能會比較差,請趕快換到 5.4.1 之後的版本吧 🙂
Facebook Comments Box