c - 我应该缓存 dlsym 的返回值吗?

标签 c performance posix dynamic-linking dlsym

我正在使用 POSIX dlopen/dlsym API 在运行时加载动态库,然后按名称从这些库中调用函数。

存储 dlsym 的结果在性能方面是个好主意吗?某处?或者 dlsym 是否已经进行了自己的缓存,并且添加另一层是无用的甚至是有害的?函数可能会被调用很多很多次,但我并没有办法提前知道哪些函数,或者调用它们的频率。

谢谢!

最佳答案

dlsym函数不做任何缓存。它只是访问 ELF 符号表(使用它的哈希表,实现得不是很好)。

我认为您应该避免调用 dlsym多次使用相同的名称和库(例如数百万次)。

您可能会使用惰性技术:例如您的 dlsym 中使用的名称和库与 dlsym 一起调用(在您的某些结构或类中) -ed 函数指针,并调用 dlsym仅当该指针为空时。

您可能还想捕捉 dlsym尽快失败。

FWIW,您可以调用dlopendlsym很多时间。特别是,您可以拥有数十万个 dlopen -ed Linux 上的共享库,作为我的 manydl.c示例演示。但避免dlclose - 如果您仍然有一些 dlsym 的事件调用框架,则创建一个库-ed 函数里面。实际上,您可能永远不会调用 dlclose并且您的程序仍然可以工作(有轻微的进程地址空间泄漏)。

关于c - 我应该缓存 dlsym 的返回值吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10500079/

相关文章:

java - tomcat的性能极限是多少?

linux - exec 不替换当前进程,posix_spawn 内核实现

c - 怀疑malloc。 C (Linux)

c - 从串行端口读取时如何实现 read() 超时 (C/C++)

c - 如何在 C 中打印二维字符串数组(带空格)?

c - 是否有不需要空终止字符串的 strtol 等价物?

c# - 高效存储和显示富文本

linux - 在 Linux 上估算任​​务的 WCET

c - 如何使用C中的系统调用逐行读取

c++ - 如何修复递归 Flood Fill 段错误?