Qt/QML Performance Tuning #1


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

0 comments