调试程序时发现:开机后,第一次启动应用程序,第一次调用数学库函数sinf()、log10f()时,耗时特别长,有几十甚至上百个毫秒,而后续的调用,或者重启程序后(不重启电脑)的第一次调用就不会这么耗时了,统计值基本上为0毫秒。
请教XTANG:
1、是否math库会对某些函数调用进行表初始化操作,导致第一次调用比较耗时?
2、math库调用过后,是否留在内存中并共享?因为我发现只要某个函数调用过,那么之后不管是杀掉程序再次进入调试,或者进其他应用程序调用相同的函数,都不会出现耗时的情况了。
你的QNX的版本是多少?是6.5吗?
不是,我用的是6.4.1。
XTANG先生可以试一下,随便生成一个QNX C++ project 项目,在main()中调用一下sinf()函数,用clock_gettime( )函数统计调用时间,会发现在系统第一次启动好,第一次调试该函数时,统计时间至少为几十毫秒。
我的项目中闭环时间为5ms,这样就不能满足实时性了;但是我发现如果我把闭环过程中要调用的数学库函数在应用程序启动时先都调用一遍,实时闭环过程中就不会超时了,呵呵,没办法而为之。
希望XTANG指点一下,以解困惑,谢谢!
Hmm…
你的现象很像一个叫做lazy binding的东西。但是Lazy Binding只在6.5才开始支持。
你的硬件是x86吗?另一个问题是,是每一个你用到的math库函数都在第一次调用时慢呢,还是不管哪个Math库函数,只要调一次,所有的别的math库函数就都OK了呢?
我用的是x86硬件。感觉sinf()函数和sqrtf()函数任意调用一个,后续的调用都不会慢了,但log10()函数还是慢的;结论就是既不是每个函数都要单独调用后才好,也不是只要调用一个函数后,其他库函数就运行快了。技术支持告诉我要静态链接程序,试了一下,确实有用。现在都不敢用动态链接了。