我特别询问旧的msvcrt.dll
。微软是否在更新版本的Windows中更新了该库?或者是在Windows 98发行版中可以找到的完全相同的库?
我使用测试程序对Cygwin测试msvcrt,该程序通过带有互斥锁和信号量的单链表阻塞队列多次调用malloc
。通过ifdef
,程序可以编译为使用Posix函数,或者使用Windows API调用。当MinGW使用WinAPI编译时,它唯一的依赖是kernel32.dll
,ntdll.dll
和msvcrt.dll
,而当Cygwin使用Posix函数编译时,程序将取决于{{1} }。
我起初只是假设Cygwin版本运行较慢,因为Posix函数有额外的仿真层;它必须将它们转换为WinAPI调用。但它的机器运行速度似乎比MinGW编译的原生二进制文件快4倍。
Cygwin的文档声明它使用了一个名为newlib的不同libc,当然Cygwin编译的二进制文件似乎并不依赖于msvcrt。那么这会产生巨大的速度差异吗?
我之前也经历过,当一个C程序调用数百万cygwin1.dll
时,一个依赖于malloc
的程序将比其他任何程序运行慢很多,具体取决于较新的msvcrt.dll
。它们甚至比在虚拟机linux下运行的相同程序运行得慢。
msvcrXX.dll
出了什么问题?我应该尽可能避免吗?