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