日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Qt性能调节

發布時間:2025/4/16 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Qt性能调节 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

轉自:http://blog.csdn.net/qkevin123/article/details/4022608#

在低端的設備上編寫嵌入式程序的時候,Qt for Windows CE 和 Qt for Embedded Linux 都提供了大量的選項,這些選項通過很多不同的權衡來幫助減少內存和CPU的需求,這些選項非常廣泛,從編程風格,鏈接到內存分配。

? ? 請注意,最直接的節省資源的做法是不要去編譯不需要使用的功能模塊,請參考”Fine tuning features”一文,它提供了非常詳細的說明

本文一共分為如下幾個專題來講述:


  • 編程風格
  • 靜態鏈接 vs 動態鏈接
  • 另一種可選擇的內存分配方式
  • 繞開 “Backing store”


編程風格

? ? 一次性創建 dialog 和 widget,然后在需要的時候調用 QWidget::show() 和 QWidget::hide() 方法,而不是每次在需要使用的時候,都去創建它們,在不需要的時候就刪除它們。避免應用程序啟動過程緩慢,不要在一開始的時候就把 dialog 和 widget 都創建好,而是在第一次需要使用它們的時候再去創建它們。所有這些工作都能提高 CPU 的效率,當然,它們需要占用一些內存。


靜態鏈接 vs 動態鏈接

? ? 有很多CPU和內存使用ELF(Executable and Linking Format)鏈接過程,相對于那種有很多的可執行模塊然后在運行的過程中動態鏈接的方法而言,在編譯一個應用程序的時候使用靜態鏈接可以節省很多的資源。所有的程序都被靜態的編譯鏈接成了一個可執行文件中。

? ? 這個方法可以加速應用程序的啟動速度,并且可以減少內存消耗,付出的代價是靈活性(當添加一個模塊的時候,必須重新編譯這個單一的可執行程序)和程序的健壯性(如果一個模塊有bug,那么整個程序都將收到影響)。


創建靜態鏈接

? ? 在運行 configure 命令的時候,使用 –static 編譯選項,這樣就可以把整個 Qt 編譯成靜態鏈接庫。

? ???./configure –static

? ? 為了編譯一組應用程序到成一個單一的應用程序,把每一個應用程序都定義成一個獨立的Widget(或者是一個widget的集合),并且在main()函數中包含盡可能少的代碼。然后再寫另外一個應用程序提供一種在這些不同的應用程序之間切換的方式。Qt Extended 平臺是使用這個方法的最好的例子,它可以被編譯成一組動態鏈接的可執行文件,也可以編譯成一個單一的靜態鏈接程序。

? ? 注意:一個應用程序還是會動態的去鏈接標準的C庫,和在設備上會被其它程序使用到的一些庫。

? ? 當安裝最終用戶的應用程序的時候,這種方法可能不是一個可行的選擇,但是當為一個設備編寫一個單一的應用程序的時候,尤其是這個設備只有很有限的CPU能力和內存的時候,這種方法非常有好處。

?

另外一種可選的內存分配方法

? ? 某些平臺上的C++編譯器,new 和 delete 操作符的效率特別低,重新實現這個操作符能夠提高內存管理的效率。

  • void *operator new[](size_t size)
  • {
  • ? ???return malloc(size);
  • }
  • void *operator new(size_t size)
  • {
  • ? ???return malloc(size);
  • }
  • void operator delete[](void *ptr)
  • {
  • ? ???free(ptr);
  • }
  • void operator delete[](void *ptr, size_t)
  • {
  • ? ???free(ptr);
  • }
  • void operator delete(void *ptr)
  • {
  • ? ???free(ptr);
  • }
  • void operator delete(void *ptr, size_t)
  • {
  • ? ???free(ptr);
  • }
  • 復制代碼

    上面這段代碼展示了必要的代碼,如何切換到相應的 C 語言的內存分配方式。


    繞過 ”Backing store”

    ? ? 在繪圖輸出的時候,Qt會使用一個”Backing store”的概念,比如,一個繪圖緩沖區,為了減少界面閃爍,并且支持一個圖形操作,比如混合等。

    ? ? 對于每一個客戶端程序的缺省行為是,程序把自己的widget畫到一塊內存中,然后Windows Server負責把這段內容放到屏幕上去。但是如果是定義良好的硬件的話,并且在嵌入式設備中經常都是這種情況,繞過這個過程就會非常有用,這樣就允許客戶端應用程序直接操作底層硬件,這里有兩種方法去完成直接繪制,第一種方法是為每一個widget都設置Qt::WA_PaintOnScreen窗口屬性;另一種方法是使用QDirectPainter類來在framebuffer上面保留一塊區域。更多的詳細信息請參考”Architecture”文檔中的”direct painting”一節。

    ?

    ---------------------------------------------------------------
    聲明:本文是Qt核心技術論壇翻譯文章,如需轉載,請注明本文鏈接:
    http://www.insideqt.com/bbs/viewthread.php?tid=31

    注:本文翻譯自 Qt 4.5.0 for Embedded Linux 的聯機幫助文檔,”Qt Performance Tuning”

    總結

    以上是生活随笔為你收集整理的Qt性能调节的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。