2013-05-08 168 views
3

我在Win32控制檯應用程序中引入了MATLAB生成的C++共享庫。 MATLAB程序需要2-3秒才能在MATLAB中執行,但控制檯應用程序需要11-12秒才能執行。我讀到這是因爲MCR的啓動時間,我相信在MCR初始化後,它必須花費與matlab相同的時間。那麼,如何加載或初始化MCR,使其始終位於RAM或緩存中,以便控制檯應用程序運行需要2-3秒?我應該不得不做一個無限循環,以便連續加載MCR?我正在使用Windows操作系統,我正在從PHP調用控制檯應用程序。任何教程或鏈接?如何初始化並加載MCR

我已經添加了MCR_CACHE_ROOT作爲指向文件夾(不是臨時)的環境變量。我的控制檯應用程序的代碼如下:

// shoes_shared.cpp : Defines the entry point for the console application. 
// 
#include "stdafx.h" 
#include "shoes_sharedlibrary.h" 
#include <iostream> 
#include <string.h> 
#include "mex.h" 



using namespace std; 

int _tmain(int argc, _TCHAR* argv[]) 
{ 
    /* Call the MCR and library initialization functions */ 
//const char *pStrings[]={"-nojvm","-nojit"}; 
// if (!mclInitializeApplication(pStrings,2)) 
// { 
//  fprintf(stderr, "Could not initialize MCR for the application.\n"); 
//  return -1; 
// } 

if (!shoes_sharedlibraryInitialize()) 
{ 

    exit(1); 
} 



    mwArray img(argv[1]); 

    double wt1 = _tstof(argv[2]); 
    mwArray C(wt1); 
    double wt2 = _tstof(argv[3]); 
    mwArray F(wt2); 
    double wt3 = _tstof(argv[4]); 
    mwArray T(wt3); 
    double wt4 = _tstof(argv[5]); 
    mwArray S(wt4); 



      test_shoes(img,C,F,T,S); 
      //shoes_sharedlibraryTerminate(); 
      //mclTerminateApplication(); 
      return 0; 
} 

我評論過上述思想,這將使它更快,但沒有運氣的線條。任何幫助?

+0

你想在你的控制檯應用程序的兩個調用之間保持MCR在內存中?你可以把它放到單獨的進程中繼續運行 - 或者簡單地嘗試減少加載時間。如果你有一個圖形用戶界面,一種可能性是已經顯示圖形用戶界面並且在後面加載了MCR。另外..圖書館是否自動加載或可以延遲加載它以某種方式? – 2013-07-03 20:11:45

回答

0

你在調試或發佈?如果您正在運行調試,請嘗試在發行版中運行,看看是否可以解決您的問題。你在使用Visual Studio嗎?如果是這樣,請嘗試打開模塊窗口,您將看到加載的dll列表。檢查並看看你的圖書館是否經常加載和卸載,或者是否加載一次並保持加載。

0

我不知道運行哪個vm matlab,但是例如JVM就有Nailgun,這是一個在後臺運行的Java服務器,可以在需要執行某些Java應用程序時調用。我知道Matlab使用Java,但我不確定你的DLL是否仍然調用它。所以如果是這樣,那可能是問題所在。

0

嘗試將MCR和所有共享庫依賴項放入RAM驅動器。

有很多方法來創建RAM驅動器。我會建議使用ImDisk