为什么Mac OS上的c函数`open`〜4x慢于同一台机器上的Ubuntu VM?

问题描述

为什么MacOS的打开文件速度比同一台计算机上的Ubuntu VM慢4倍?

使用与发现此行为的代码相似的设置的MWE

#include <stdio.h>
#include <fcntl.h>
#include <time.h>
int main()
{
    struct timespec tstart={0,0},tend={0,0};
    clock_gettime(CLOCK_MONOTONIC,&tstart);

    int fd = open("/path/to/testfile.txt",O_RDONLY | O_CLOEXEC,S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH);

    clock_gettime(CLOCK_MONOTONIC,&tend);
    printf("%.0f µs\n",(((double)tend.tv_sec + 1.0e-9*tend.tv_nsec) - ((double)tstart.tv_sec + 1.0e-9*tstart.tv_nsec)) * 1.0e6);

   return 0;
}

在具有SSD的MacBook Pro上,MacOS 10.15.7,没有SIP,没有文件

51 µs
46 µs
49 µs
30 µs
46 µs

同一台计算机上的Ubuntu 20.04 VM(并行)

12 µs
12 µs
12 µs
13 µs
13 µs

解决方法

open函数中花费的时间不太可能与磁盘或备份文件系统类型有关。相反,这主要与操作系统对系统调用的实现有关,尤其可能与文件系统抽象模型有关。 Linux是一个单片内核,没有涉及不同的特权域或内存空间,并且旨在使系统调用非常快。至少MacOS X最初是建立在Apple几十年来一直热衷于微内核的东西上的,如果还是那样的话,系统调用的成本可能会更高。如今,他们甚至可以使用防病毒软件或类似的东西。