在服务器循环中调用时间(NULL)有多贵?

时间:2011-01-12 12:12:43

标签: c time

我正在检查一个服务器实现,它为每个正在处理的请求调用时间(NULL)。我想知道调用时间(NULL)对典型的Linux系统有什么影响,如果有更便宜的命令来确定当天 - 或者通常你会多久调用一次()?

感谢您对该主题的看法。

5 个答案:

答案 0 :(得分:8)

这是一个系统调用,就像其他答案所说的那样,其他答案为您提供了一种衡量系统成本的好方法。 (一旦进入内核,它就不需要做太多工作,所以它非常接近纯系统调用开销的成本。而且Linux已经尽其所能有效地实现系统调用。所以从这个意义上说,你可以认为它很好优化。)

与其他答案不同,我不会认为这么便宜,以至于自动不值得担心。如果这是在一个内循环中,它取决于你在内循环中做了什么。如果这是一个处理请求的服务器,那么每个请求可能会产生很多系统调用,而且每个请求的成本确实不会有太多变化。但是,我已经看到了调用time()(或gettimeofday()的syscall开销的代码,这实际上归结为它)确实会产生不利影响。

如果您担心成本问题,那么接下来要问自己的是找到时间的便宜方式。一般来说,不会有更便宜的好方法。如果您使用的是x86,则可以向CPU请求rdtsc指令(并且可能在其他cpu架构上有模拟) - 这是一个没有特权的汇编指令,因此您可以将其放入代码中的任何位置。但是存在很多陷阱 - rdtsc并不总是以可预测的速率增加,特别是如果cpu速度因电源管理而改变,这取决于你正在使用的cpu的精确模型;这些值可能无法跨多个cpu等同步。操作系统会跟踪所有这些,并在您调用gettimeofday()时为您提供友好,易用的信息版本。

答案 1 :(得分:3)

获取当前时间涉及对Linux的系统调用。由于Vilx的吸收,它很容易进行基准测试:

#include <time.h>

int main(void)
{
    int i;
    for (i = 0; i < 10000000; i++)
        time(NULL);
    return 0;
}

运行这个程序需要6.26s在我的wimpy 1.6GHz Atom 330上使用64位内核,相当于每次调用大约1002个CPU周期(6.26s *每秒1.6G周期/ 10Miters≈1002个周期)。

正如其他人所指出的,这当然不值得关注。

答案 2 :(得分:2)

在Linux(不是较旧的Linux)上,这不是系统调用,它确实非常快,是如此之快,只需不到10个周期。在vdso中实现,即用户空间调用。

请参阅: https://github.com/torvalds/linux/blob/dd53a4214d4ff450b66ca7d2e51d9369e3266ebf/arch/x86/entry/vdso/vclock_gettime.c#L318

答案 3 :(得分:1)

真的是你的瓶颈吗?我建议改为分析。获取当前时间是非常常见操作,我非常怀疑它是否昂贵(尽管您可以轻松编写程序来测量它)。例如,所有Web服务器都会在每个日志文件请求时执行此操作。

答案 4 :(得分:0)

这只是一个没有在内核中进行大量处理的系统调用。如果你的服务器向用户发送文件,那么time()没有区别,这需要100个read()/ write()或者做这样的事情。