為什麼MSVC中的rand函數非常慢?

我的CPU是i5-5250U。在開啟優化的情況下(cl.exe /O2),平均每一次rand()函數的調用都要花費21.2ns的時間。相比之下,用MinGW GCC 5.3編譯出來的程序,平均每一次rand()函數的調用只需要12.71ns的時間。

測試代碼:

#include &
#include &
#include &
using namespace std;

int main()
{
srand(time(0));
constexpr int loop_length = 100 * 1000 * 1000;
int t1 = clock();
for(int i = 0; i &< loop_length; ++i) rand(); int t2 = clock(); cout &<&< (t2 - t1) * 1000.0 / CLOCKS_PER_SEC &<&< "ms" &<&< endl; cout &<&< rand() &<&< endl; return 0; }


msvc用了/MD的話,和mingw一樣都是調用msvcrt里的rand,不會有區別的。(我剛看了源代碼,沒理由有區別)

我以前也遇到過,同一段代碼在cygwin的gcc下,比msvc出來的快很多。後來發現,cygwin下的clock()不準。。。。


實際測試表示沒有顯著差別,多次測試兩者都在11xx~13xx之間晃悠


可是 MinGW 的 rand 函數調用的是 msvcrt.dll 中的 rand,也是 VC 的庫啊。


CPU i5-3210M

VC++ 19.00.23918(/O2)輸出為5350ms

g++(TDM-GCC64 5.1.0) /O2輸出為3710ms

用Dependency Walker打開VC++生成的可執行文件後並沒有msvcrt.dll的依賴項,這說明rand函數是隨運行庫附加在可執行文件當中的。

g++的可執行文件中可見調用的是msvcrt.dll中的rand()

VC++的標準庫Dinkumware向來名聲不佳(性能比較糟糕),而msvcrt.dll採用的不是VC++的那一套。


推薦閱讀:

在公司內部使用Visual Studio 6.0,從網上下載的盜版的,會存在被微軟起訴盜版的風險嗎?
如果僅考慮 Windows 平台,不用 msvc 而去用 gcc 的理由有哪些?
事件驅動機制跟消息驅動機制相比,有哪些優劣的地方?

TAG:微軟Microsoft | C | MicrosoftVisualStudio | VisualC | 編譯器 |