在matlab中运行编译的mex代码时,mingw比cygwin慢吗?

时间:2015-02-18 12:15:46

标签: performance matlab gcc cygwin mingw

我在Windows中的Matlab中使用gnumex来设置mex来编译c ++代码。 Cygwin的设置存在问题,导致我无法使用fopen。因此,我安装了mingw解决了fopen的问题。但是对于一个不包含fopen / fclose的程序,我发现与cygwin相比,mingw中的性能降低了5级。预期会出现这种情况吗?

以下是cygwin和mingw使用的gcc / g ++版本:

D:\cygwin64\bin>gcc --version
gcc (GCC) 4.8.3
Copyright (C) 2013 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

D:\mingw64\mingw64\bin>gcc --version
gcc (x86_64-posix-seh-rev1, Built by MinGW-W64 project) 4.9.2
Copyright (C) 2014 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

Mingw正在使用更新版本的gcc。所以,我认为它应该更快。但事实并非如此。

此外,mex -v在编译文件时产生几乎相同的输出:(唯一的区别在于LINKFLAGS。-mwindows和GM_ISCPP的顺序相反。)

对于Cygwin,

 This is mex, Copyright 1984-2007 The MathWorks, Inc. 

 -> Default options filename found in         C:\Users\achaudhary\AppData\Roaming\MathWorks\MATLAB\R2009b 
---------------------------------------------------------------- 
->    Options file           =     C:\Users\achaudhary\AppData\Roaming\MathWorks\MATLAB\R2009b\mexopts.bat 
  MATLAB                 = C:\PROGRA~1\MATLAB\R2009b 
->    COMPILER               = gcc 
->    Compiler flags: 
     COMPFLAGS           = -c -DMATLAB_MEX_FILE -x c++ 
     OPTIMFLAGS          = -O3 
     DEBUGFLAGS          = -g 
     arguments           =  
     Name switch         = -o 
->    Pre-linking commands   =  
->    LINKER                 =     C:\PROGRA~1\MATLAB\R2009b\sys\perl\win32\bin\perl.exe E:\MATLAB~1\linkmex.pl 
->    Link directives: 
     LINKFLAGS           =   -mwindows -    LC:\Users\ACHAUD~1\AppData\Roaming\MATHWO~1\MATLAB\R2009b\gnumex GM_ISCPP   -mwindows 
     LINKDEBUGFLAGS      = -g  -Wl,--image-base,0x28000000\n 
     LINKFLAGSPOST       =  
     Name directive      = -o pnlFitness_cpp.mexw64 
     File link directive =  
     Lib. link directive =  
     Rsp file indicator  =  
 ->    Resource Compiler      =    C:\PROGRA~1\MATLAB\R2009b\sys\perl\win32\bin\perl.exe E:\MATLAB~1\rccompile.pl -o mexversion.res 

 ->    Resource Linker        =  
---------------------------------------------------------------- 


 --> gcc  -c -DMATLAB_MEX_FILE -x c++ -   oC:\USERS\ACHAUD~1\APPDATA\LOCAL\TEMP\MEX_FZ~1\pnlFitness_cpp.obj -    IC:\PROGRA~1\MATLAB\R2009b\extern\include -IC:\PROGRA~1\MATLAB\R2009b\simulink\include -O3 -DMX_COMPAT_32 pnlFitness_cpp.cpp 


--> C:\PROGRA~1\MATLAB\R2009b\sys\perl\win32\bin\perl.exe E:\MATLAB~1\linkmex.pl -o pnlFitness_cpp.mexw64   -mwindows -LC:\Users\ACHAUD~1\AppData\Roaming\MATHWO~1\MATLAB\R2009b\gnumex GM_ISCPP   -mwindows -s  C:\USERS\ACHAUD~1\APPDATA\LOCAL\TEMP\MEX_FZ~1\pnlFitness_cpp.obj   

link command: g++ -shared C:\Users\ACHAUD~1\AppData\Roaming\MATHWO~1\MATLAB\R2009b\gnumex\mex.def -o pnlFitness_cpp.mexw64 -mwindows -LC:\Users\ACHAUD~1\AppData\Roaming\MATHWO~1\MATLAB\R2009b\gnumex  -mwindows -s C:\USERS\ACHAUD~1\APPDATA\LOCAL\TEMP\MEX_FZ~1\pnlFitness_cpp.obj -llibmx -llibmex -llibmat 

对于Mingw来说,

This is mex, Copyright 1984-2007 The MathWorks, Inc. 

-> Default options filename found in C:\Users\achaudhary\AppData\Roaming\MathWorks\MATLAB\R2009b 
---------------------------------------------------------------- 
->    Options file           =   C:\Users\achaudhary\AppData\Roaming\MathWorks\MATLAB\R2009b\mexopts.bat 
      MATLAB                 = C:\PROGRA~1\MATLAB\R2009b 
->    COMPILER               = gcc 
->    Compiler flags: 
     COMPFLAGS           = -c -DMATLAB_MEX_FILE -x c++ 
     OPTIMFLAGS          = -O3 
     DEBUGFLAGS          = -g 
     arguments           =  
     Name switch         = -o 
->    Pre-linking commands   =  
->    LINKER                 = C:\PROGRA~1\MATLAB\R2009b\sys\perl\win32\bin\perl.exe E:\MATLAB~1\linkmex.pl 
->    Link directives: 
     LINKFLAGS           = -mwindows -LC:\Users\ACHAUD~1\AppData\Roaming\MATHWO~1\MATLAB\R2009b\gnumex -mwindows GM_ISCPP 
     LINKDEBUGFLAGS      = -g  -Wl,--image-base,0x28000000\n 
     LINKFLAGSPOST       =  
     Name directive      = -o pnlFitness_cpp.mexw64 
     File link directive =  
     Lib. link directive =  
     Rsp file indicator  =  
->    Resource Compiler      = C:\PROGRA~1\MATLAB\R2009b\sys\perl\win32\bin\perl.exe E:\MATLAB~1\rccompile.pl  -o mexversion.res 
->    Resource Linker        =  
---------------------------------------------------------------- 


--> gcc  -c -DMATLAB_MEX_FILE -x c++ -oC:\USERS\ACHAUD~1\APPDATA\LOCAL\TEMP\MEX_YK~1\pnlFitness_cpp.obj -IC:\PROGRA~1\MATLAB\R2009b\extern\include -IC:\PROGRA~1\MATLAB\R2009b\simulink\include -O3 -DMX_COMPAT_32 pnlFitness_cpp.cpp 


--> C:\PROGRA~1\MATLAB\R2009b\sys\perl\win32\bin\perl.exe E:\MATLAB~1\linkmex.pl -o pnlFitness_cpp.mexw64 -mwindows -LC:\Users\ACHAUD~1\AppData\Roaming\MATHWO~1\MATLAB\R2009b\gnumex -mwindows GM_ISCPP -s  C:\USERS\ACHAUD~1\APPDATA\LOCAL\TEMP\MEX_YK~1\pnlFitness_cpp.obj   

link command: g++ -shared C:\Users\ACHAUD~1\AppData\Roaming\MATHWO~1\MATLAB\R2009b\gnumex\mex.def -o pnlFitness_cpp.mexw64 -mwindows -LC:\Users\ACHAUD~1\AppData\Roaming\MATHWO~1\MATLAB\R2009b\gnumex -mwindows  -s C:\USERS\ACHAUD~1\APPDATA\LOCAL\TEMP\MEX_YK~1\pnlFitness_cpp.obj -llibmx -llibmex -llibmat 

1 个答案:

答案 0 :(得分:0)

根据我的经验,MinGW通常会生成比相应的cygwin生成的代码运行得更快的代码...有时候显着如此。毕竟,MinGW生成本机​​Windows代码,因此它不会受到cygwin的POSIX仿真层开销的影响。

显然,你的经历与我的不同;我不知道为什么,而且我也不知道Matlab基础设施会产生什么样的开销。