我正在尝试编写一些适用于Linux和Win32的代码。 我发现它们之间最显着的差异(在我的代码中)是fopen()
性能。
下面的代码需要5秒在我的Ubuntu和相同的代码需要超过100秒的Windows XP。 我想在这里做一个说明,即Ubuntu是虚拟机,而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);
显然fopen()
是造成这种差异的原因。 我想知道为什么这么大的差别?
显然fopen()是造成这种差异的原因
不,它更可能是文件系统冲洗。
在写一个系统时,或者更可能调用fclose(),它会阻塞,直到字节在物理上位于磁盘上(或者至少在磁盘表示它们为止) – 另一个系统立即返回,即使苍蝇还在写
你使用病毒扫描程序? 如果是先禁用它!
而且一些API调用在Windows上比较慢。 EG你的C:\将首先被翻译成/ harddrive /东西(只是一个例子)。
这里使用的API不仅仅是API。
您正在文件系统上打开一个文件。
所以正在使用的文件系统的类型将影响实现文件系统的设备的时间以及硬件速度。 有太多的因素,你没有考虑到,你可以准确地说X是慢速的罪魁祸首。
如果您使用的是Visual C ++,请注意,默认情况下,stdio现在使用互斥锁来启用安全的多线程。 这些可以用#define _CRT_DISABLE_PERFCRIT_LOCKS
来关闭。 [编辑31/12/2013] 我不确定,但我认为Linux stdio实现通常承担单线程行为,所以不要有这种锁定开销。 Linux stdio实现同样遵守POSIX和C11标准,要求安全的多线程,提供名称以_unlocked
结尾的无锁版函数,例如fgetc_unlocked()
。
更多信息: http : //msdn.microsoft.com/en-us/library/ms235505%28v=VS.80%29.aspx
这不相关。 这不是I / O功能的正常使用场景,所以不必为这种情况进行优化。 也许windows使用syncronous flush()而linux使用异步。
我会做以下几点:
他们很可能不会做同样的事情。 文件系统可能是负责任的。 无论是win32盒子都做了更多的冲洗 – 可能是因为它有更少的内存可用,由于其他任务 – 或者Linux的盒子运行在硬件上,使得脸红,并引入另一层次的缓存 – 即作弊。
您的应用需要什么样的耐用性? 如果文件绝对不能在电源故障时消失(例如邮件服务器接收邮件),那么你应该fsync()它们。 fclose()不保证这样做