早上好。大家。(qt/embedded)如何在運行程序之前加載庫
我正在使用qt 4.8。 (嵌入式Linux) 服務器應用程序正在使用qprocess()執行客戶端應用程序。此時,客戶端應用程序的加載速度很慢,因此係統在用戶看到它時似乎處於暫停狀態。
我認爲緩慢的原因是將外部庫加載到內存中的時間。所以我想知道當服務器應用程序經過init進程時是否有預先加載客戶端應用程序使用的庫的方法。
請讓我知道是否有更好的方法。謝謝。
早上好。大家。(qt/embedded)如何在運行程序之前加載庫
我正在使用qt 4.8。 (嵌入式Linux) 服務器應用程序正在使用qprocess()執行客戶端應用程序。此時,客戶端應用程序的加載速度很慢,因此係統在用戶看到它時似乎處於暫停狀態。
我認爲緩慢的原因是將外部庫加載到內存中的時間。所以我想知道當服務器應用程序經過init進程時是否有預先加載客戶端應用程序使用的庫的方法。
請讓我知道是否有更好的方法。謝謝。
因爲其他應用程序必須在啓動時加載它自己的庫,所以這不是一件容易的事情,但是您可以通過準備所需的應用程序及其庫來從ramdisk加載而不是從硬盤加載來避開緩慢加載-disk。
在主應用程序使用安裝
sudo mount -t tmpfs -o size=200M none /mnt/ramdisk
拷貝所有需要的文件了,併成立$LD_LIBRARY_PATH
爲環境指向您的ramdisk創建一個RAM磁盤(QT)
auto env = QProcess::systemEnvironment();
env.insert("LD_LIBRARY_PATH","/mnt/ramdisk");
設置新環境作爲您QProcess的環境。由於我不是100%確定,因此會從此處加載您的庫,作爲替代,您可以在chroot環境中創建一個chroot
環境和設置庫/usr/lib
。
這個想法是將從RAM加載的庫和應用程序加載到RAM中,這比從磁盤加載要快得多。
感謝您的回答。我認爲這是一個好主意。我以這種方式做了測試。我將qt應用程序執行所需的qt庫移至ramdisk。 A應用程序的執行速度顯着提高。但是,在A應用程序中使用QProcess()執行的B應用程序的執行速度是相同的。 – Taey
如果你對應用程序打開文件描述符,你可能會看到應用程序仍然試圖從磁盤而不是RAMdisk加載庫。這就是linux的共享庫概念及其搜索和加載優先級路徑。檢查'ld.so.conf'。 –
預加載和預鏈接可能有所幫助。從未使用它們,但發現一些文檔開始:https://wiki.archlinux.org/index.php/Preload
您可以嘗試使用QLibraby在第一個程序中加載它。不知道這是否是最好的方法。 –
@DragosPop QLibrary將共享庫加載到當前進程中,所以在這裏不起作用。 – MrEricSir
我知道,它可能有助於緩存庫。無論如何,我找到了一個麪糊解決方案。看到我的回答。 –