我从C#调用两个C++函数.虽然在大约100万次调用的迭代中这样做,但我看到了大约30%的开销.
C++函数:
EXTERN_C void STDAPICALLTYPE FunctionA(UINT_PTR mathId)
{
...
...
}
Run Code Online (Sandbox Code Playgroud)
在我的C#程序集中,dll为:
[DllImport("CPlusPlus.dll")]
public static extern void FunctionA([In] IntPtr mathID);
Run Code Online (Sandbox Code Playgroud)
从以下功能调用:
public static void HelpingFunction([In]UInt64 mathID)
{
FunctionA((IntPtr)mathID);
}
Run Code Online (Sandbox Code Playgroud)
当"HelpingFunction"被调用超过一百万次时,这种实现方式会产生更多的开销.
有人可以给我其他想法,以便减少开销吗?从C#程序集调用C++函数的其他方法有哪些?
我已经通过 Visual Studio 2012 将我的 .NET 检测分析器部署到 Azure webapps 中。我的分析器执行字节码检测,如下所示,
FunctionA()
{
--> Injected C# function Call
functionA's body
-->Injected C# function Call
}
Run Code Online (Sandbox Code Playgroud)
注入的函数调用驻留在单独的程序集 dll 上。在物理框中,程序集将添加到 GAC 中。但在 Azure 中,它将出现在 web 应用程序位置的文件夹中,该文件夹将在 web.config 文件中进行探测。
使用 IMetaDataAssemblyEmit 的 DefineAssemblyRef,我定义了程序集及其在加载到进程中的每个模块中的功能。该问题是注入的函数调用仅适用于Web应用程序模块的功能..!System.Web.dll 或 System.Data.dll 等其他模块无法调用该函数,这导致 Azure Web 应用程序无法加载并出现 502 错误。
很快,注入到 Web 应用程序以外的模块中就失败了。我猜这是加载自定义程序集时的安全问题,我也尝试设置[assembly: System.Security.AllowPartiallyTrustedCallers]和PermissionSetAttribute(SecurityAction.Demand, Name = "FullTrust")]其他一些安全属性.. 没有帮助.. 如何使这个帮助程序集由 .Net 模块加载。?我是否需要为程序集设置任何其他特定的安全属性才能加载..?
profiler azure .net-assembly azure-web-app-service clr-profiling-api
有两个线程,一个将插入地图,另一个将从地图插入find。
map<string,object>* mapA;
Run Code Online (Sandbox Code Playgroud)
如果线程A将配置对象插入带字符串键的Map中。
线程B将尝试查找具有相同字符串键的位置。如果不存在,它将重试直到找到它的字符串。
如果在读取线程B的同时插入线程A,会在进程中导致崩溃或数据损坏吗?这里需要同步吗?
在使用示例应用程序进行测试时,我面临任何类型的崩溃或损坏
我需要将日志数据写入来自不同进程的单个文件中.
我正在使用Windows Mutex,它需要Common Language Runtime支持.
Mutex^ m = gcnew Mutex( false,"MyMutex" );
m->WaitOne();
//... File Open and Write ..
m->ReleaseMutex()
Run Code Online (Sandbox Code Playgroud)
我真的需要从C++更改为C++/CLI进行同步吗?
如果不使用原子就可以了.但我需要知道,与本地互斥锁相比,使用此互斥锁是否会降低性能.
我有一个共享向量,可通过两个线程访问。
线程A的函数推入向量,线程B的函数将向量完全交换以进行处理。
MovetoVec(PInfo* pInfo)
{
while(1)
{
if(GetSwitch())
{
swapBucket->push_back(pInfo);
toggles = true;
break;
}
else if(pInfo->tryMove == 5)
{
delete pInfo;
break;
}
pInfo->tryMove++;
Sleep(25);
}
}
Run Code Online (Sandbox Code Playgroud)
线程A试图使原子布尔值toggles变为true并推入向量。(上面的MoveToVec函数将被许多线程调用)。函数GetSwitch定义为
GetSwitch()
{
if(toggles)
{
toggles = false;
return TRUE;
}
else
return FALSE;
}
Run Code Online (Sandbox Code Playgroud)
toggles 这是atomic_bool,线程B中另一个交换向量的函数是
GetClassObj(vector<ProfiledInfo*>* toSwaps)
{
if(GetSwitch())
{
toSwaps->swap(*swapBucket);
toggles = true;
}
}
Run Code Online (Sandbox Code Playgroud)
如果GetSwitch返回false,则threadB不执行任何操作。在这里我不使用任何锁定。它在大多数情况下都有效。但是有时pInfo,swapBucket 中的对象之一为NULL。我知道这是因为同步不良。
我遵循这种类型的GetSwitch()逻辑只是为了忽略由锁定引起的开销。我应该放弃这个并返回互斥或关键部分的东西吗?