系统调用还是dlsym?哪种方式更快?

时间:2016-04-30 17:14:14

标签: c


我在C中调用类似write()的系统调用,另一方面,我使用write()以这种方式调用dlsym()

ssize_t original_write(int fd, const void *buf, size_t count)
{
    typedef ssize_t (*orig_write_type)(int, const void *, size_t);
    static orig_write_type orig_write;
    if (!orig_write)
        orig_write = (orig_write_type) dlsym(RTLD_NEXT, "write");
    ssize_t ret = orig_write(fd, buf, count);
    return ret;
}

我很好奇哪条路更快?当我致电write()时,它还会隐式调用dlsym()来获取其地址?请指正。非常感谢你的时间。

1 个答案:

答案 0 :(得分:1)

当谈到“哪个更快”的问题时,请使用分析器并自行计算代码。

话虽这么说,静态呼叫总是比第一次呼叫的动态呼叫更快。一旦动态加载了该函数,这两个函数应该以接近的速度运行。显示的动态方法使用了一些额外的指令来检查static变量,因此动态调用不会像静态调用一样快

您可以通过完全删除static变量来避免这种情况。编写一个存根函数并声明一个指向该存根的函数指针变量。让存根加载实际函数,更新变量以指向它,然后调用它。然后,您可以使用函数指针进行所有调用。第一次调用存根,后续每次都会直接调用实际函数。