Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C win32上fopen()的性能_C_Linux_Winapi - Fatal编程技术网

C win32上fopen()的性能

C win32上fopen()的性能,c,linux,winapi,C,Linux,Winapi,我正在尝试编写一些在Linux和Win32上都能工作的代码。我发现它们之间(在我的代码中)最显著的区别是fopen()的性能 下面的代码在我的Ubuntu上需要5秒,在WindowsXP上同样的代码需要100秒以上。我想在这里指出,ubuntu是VM,而XP是在真正的机器上 time_t start = time(NULL); for(int i=0; i < 100000; ++i){ FILE *fp = fopen("a.txt", "a");

我正在尝试编写一些在Linux和Win32上都能工作的代码。我发现它们之间(在我的代码中)最显著的区别是
fopen()
的性能
下面的代码在我的Ubuntu上需要5秒,在WindowsXP上同样的代码需要100秒以上。我想在这里指出,ubuntu是VM,而XP是在真正的机器上

    time_t start = time(NULL);
    for(int i=0; i < 100000; ++i){
        FILE *fp = fopen("a.txt", "a");
        if (fp != NULL)
        {
            fprintf(fp, "Hello World");
            fclose(fp);
        }
    }
    time_t end = time(NULL);

    printf("\n It took %d seconds \n", end-start);
time\u t start=time(空);
对于(int i=0;i<100000;++i){
文件*fp=fopen(“a.txt”、“a”);
如果(fp!=NULL)
{
fprintf(fp,“你好世界”);
fclose(fp);
}
}
时间\u t结束=时间(空);
printf(“\n用了%d秒\n”,结束-开始);

显然,
fopen()
是造成这种差异的原因。我想知道为什么会有这么大的区别?

你使用病毒扫描程序吗?如果是,首先禁用它

在windows上,某些API调用速度较慢。例如,您的C:\将首先转换为/harddrive/something(只是一个示例)

显然,fopen()是造成这种情况的原因 差别

不,更可能是文件系统刷新。

在一个系统上,当您写入时,或者更可能调用fclose(),它会阻塞,直到字节实际位于磁盘上(或者至少直到磁盘表明它们在磁盘上)——在另一个系统上,文件系统会立即返回,即使flies仍在写入,这与此无关。这不是I/O函数的正常使用场景,因此不必针对这种情况对它们进行优化。也许windows使用的是syncronous flush(),而linux使用的是Asynronous。

这里使用的不仅仅是API

您正在文件系统上打开一个文件。

因此,所使用的文件系统类型将影响时间,以及实现文件系统的设备的硬件速度。有太多的因素,你不能考虑,你可以准确地说X是慢速度的罪魁祸首。

< P>如果你使用VisualC++,请注意默认情况下,STDIO现在使用互斥体来启用安全的多线程。可以使用
#定义#CRT(CRT)禁用(PERFCRIT)锁
关闭这些功能[EDIT 31/12/2013]我不确定,但我认为Linux stdio实现通常采用单线程行为,因此没有这种锁定开销。Linux stdio实现同样遵守和C11标准,这些标准要求安全的多线程,提供了名称以
\u unlocked
结尾的函数的无锁版本,例如
fgetc\u unlocked()


更多信息请点击此处:

我将执行以下操作:

  • 在与预期目标类似的实际硬件机器上尝试它
  • 在Windows和Linux测试中使用同一台机器-双引导it或其他
  • 禁用windows机箱上的所有第三方加载项,尤其是AV软件(注意:如果您的公司IT部门不允许,请向他们解释这是一台软件开发实验室机器,如果与主办公网络适当分离,则无需遵守其政策)
  • 他们很可能不是在做同样的事情。文件系统可能对此负责。要么win32 box正在进行大量刷新(可能是因为其他任务导致可用ram减少),要么Linux box运行在伪造刷新并引入另一级缓存(即欺骗)的硬件上


    您在应用中需要什么级别的耐久性?如果文件绝对不能在电源故障时消失(例如,邮件服务器接收邮件),则应使用fsync()将其删除。fCute[()不保证做这个< /p>您的问题是标记C++。你试过使用iostreams吗?这是个错误,谢谢你指出。是的,你完全正确。关于fopen(),我的假设是完全错误的。我删除fCuffe(),只是为了测试它,它在Windows上是平价的。@ vrRAthod:虽然马丁可能是正确的,省略<代码> fCuteLe()/Case>仍然不是一个好的测试——一方面,你将耗尽打开的文件限制(在两个OSE上),然后是<代码>如果不执行< /Cord>语句。在他们两个人身上。但这并不能保证——FS几乎可以随心所欲,文件/流的缓存也完全不同。如果Linux有更多的RAM,它会更快。文件系统(VAT、NTFS、EXT3、XFS等)也应该考虑在内:看看这个标准规定的stdio的Linux实现是线程安全的。这就是为什么有一整套API,比如
    fread\u unlocked
    @strcat:关于stdio的线程安全性,我能找到的唯一标准是POSIX标准,这里提到:。它是C99还是C11的一部分?(请注意,这个答案是在2010年发布的。)直到C11,线程才是C的一部分,因此直到那时才添加了这个措辞。Linux和其他*nix操作系统实现POSIX。@strcat:我做了一些编辑。如果你有一个关于C11标准的好链接,请加上它——我找不到任何关于谷歌的非常明确的东西。这是一个非常有效的理由,即使它可能不适用于这种特殊情况。我最近在一篇帖子中看到,Windows的网络性能与Linux相差无几,但当Windows防火墙关闭后,这种差距就消失了。我同意这似乎是合理的,甚至可能是可能的。