2
    static const int MAX_BUFFER_LEN = 1024*12; //in byets
    char *bff = new char[MAX_BUFFER_LEN];
    int fileflag = O_CREAT | O_WRONLY | O_NONBLOCK;

    fl = open(filename, fileflag, 0666);

    if(fl < 0)
    {
        printf("can not open file! \n");
        return -1;
    }

    do
    {

        ///begin one loop
        struct timeval bef;
        struct timeval aft;
        gettimeofday(&bef, NULL);

        write(fl, bff, MAX_BUFFER_LEN);

        gettimeofday(&aft, NULL);

        if(aft.tv_usec - bef.tv_usec > 20000) //ignore second condition
        {   
            printf(" cost too long:%d \n", aft.tv_usec - bef.tv_usec);
        }   
        //end one loop

        //sleep
        usleep(30*1000); //sleep 30ms


    }while(1);

当我在 Linux ubuntu 2.6.32-24-generic 上运行程序时,我发现 COST TOO LONG 打印在一分钟内显示 1~2 次。我尝试了U盘和硬盘。我也在arm平台上尝试了这个程序。这种情况也发生了。我认为 3.2Mbps 对于低速 IO 设备来说太高了。所以我降低到0.4Mbps。它显着降低了打印频率。有什么办法可以控制时间成本吗?write() 只是将数据复制到 kenal 缓冲区并立即返回还是等待磁盘 IO 完成?kenal IO缓冲区是否已满并且必须等待刷新但为什么只有几次花费这么长时间?

4

3 回答 3

3

你不能加速磁盘,但你可以在磁盘工作时做其他事情。您无需等待它完成。

然而,这在 C 中非常重要。您需要非阻塞 I/O、多线程或多处理。尝试搜索这些关键字以及如何使用不同的技术(您已经在那里使用了非阻塞 fd)。

于 2013-04-19T02:06:35.503 回答
2

您的磁盘 I/O 性能受到每次写入周围代码以测量时间的负面影响(并且在此粒度测量时间会随着计算机执行其他操作而偶尔出现峰值)。

相反,测量代码的性能以写入整个数据 -循环的开始/结束时间(当然,循环有适当的界限)。

于 2013-04-19T02:10:02.080 回答
1

如果您正在调用您认为会花费大量时间的文件写入,那么让您的进程运行两个线程,而一个正在执行主要任务让另一个写入磁盘。

于 2013-04-19T13:07:41.470 回答