每个应用程序启动的时候都要经历下列阶段:
1)Load and Link 动态连接库
2)构建 QtopiaApplication
3) 构建 widgets
4) load 数据文件
这使得应用程序的启动变得很慢 。
方法1 :singleexec
其原理和busybox类似,缺省的时候qtopia编译成动态库,通过-singleexec参数的configure中,将
所有的应用程序静态链接成一个可执行文件qpe,每个应用可执行文件都是指向qpe的链接文件。
好处:
-
he single-exec binary is smaller than the combined sizes of the dynamic binaries.
-
The memory footprint is reduced due to the static linking.
-
All dynamic linking costs are removed due to the static linking.
This can speed up Qt Extended startup time, app startup time and plugin
load time.
坏处:
-
Cannot install new applications except by rebuilding Qt Extended.
-
The single-exec binary is too large put on a cramfs filesystem
这种方法很少采用,因为多个应用程序分开有利于调试。
方法2 :quicklauncher
quicklauncher机制是省去1),2),3)的启动时间,一个stub应用(quicklauncher)将预先运行,然后它做完1),2),3),然后等待一个请求去run一个应用程序。
当quicklauncher收到请求时,它将加载Application 插件,然后run应用程序的初始化函数(它将创建
main widget)
上述2种方法的组合:
Singleexec build?
|
quicklaunch
|
singleexec
|
result
|
no
|
no
|
no
|
regular application
|
no
|
yes
|
no
|
quicklaunch application
|
yes
|
no
|
no
|
regular application (avoid using Qt and other Qtopia libs as they will be statically linked)
|
yes
|
no
|
yes
|
singleexec application (main function mechanism)
|
yes
|
yes
|
yes
|
singleexec application (quicklaunch mechanism)
|
方法3 :
Delaying code execution.
其原理就是把那些在启动的时候不用的widget,数据文件不加载,要用的时候才去创建他们。
例如:
MainWidget::MainWidget( QWidget *parent, Qt::WFlags f )
: QMainWindow( parent, f ), settingsDialog(0)
{
}
void MainWidget::showSettings()
{ if ( !settingsDialog )
settingsDialog = new SettingsDialog( this );
settingsDialog->exec();
}
方法4 : prelink
参见,
这个方法提高了整个系统的启动时间,
Prelink工具的原理主要基于这样一个事实:动态链接和加载的过程开销很大,并且在大多数的系统上, 函数库并不会常常被更动,
每次程序被执行时所进行的链接动作都是完全相同的,对于嵌入式系统来说尤其如此。因此,这一过程可以改在运行时之前就可以预先处理好,即花一些时间利用
Prelink工具对动态共享库和可执行文件进行处理,修改这些二进制文件并加入相应的重定位等信息,节约了本来在程序启动时的比较耗时的查询函数地址等
工作,这样可以减少程序启动的时间,同时也减少了内存的耗用。
Prelink的这种做法当然也有代价:我们每次更新动态共享库时,相关的可执行文件都需要重新执行一遍Prelink才能保证有效,因为新的共享库中的
符号信息、地址等很可能与原来的已经不同了。这种代价对于嵌入式系统的开发者来说可能稍微带来一些复杂度,不过好在对用户来说几乎是可以忽略的。
阅读(713) | 评论(0) | 转发(0) |