小编ueb*_*ebe的帖子

C++/CLI函数指针与.NET代理的性能

对于我的C++/CLI项目,我只是尝试测量C++/CLI函数指针与.NET代理的成本.

我的期望是,C++/CLI函数指针比.NET代理更快.所以我的测试分别计算整个5秒内.NET委托和本机函数指针的调用次数.

结果

现在结果对我来说(现在仍然令人震惊):

  • .NET委托: 910M执行,结果为152080413333030,5003ms
  • 函数指针: 347M执行,结果为57893422166551,5013ms

这意味着,本机C++/CLI函数指针的使用率比使用C++/CLI代码中的托管委托慢近3倍.怎么可能?在性能关键部分使用接口,委托或抽象类时,我应该使用托管构造吗?

测试代码

连续调用的函数:

__int64 DoIt(int n, __int64 sum)
{
    if ((n % 3) == 0)
        return sum + n;
    else
        return sum + 1;
}
Run Code Online (Sandbox Code Playgroud)

调用该方法的代码尝试使用所有参数以及返回值,因此没有任何优化(希望如此).这是代码(对于.NET委托):

__int64 executions;
__int64 result;
System::Diagnostics::Stopwatch^ w = gcnew System::Diagnostics::Stopwatch();

System::Func<int, __int64, __int64>^ managedPtr = gcnew System::Func<int, __int64, __int64>(&DoIt);
w->Restart();
executions = 0;
result = 0;
while (w->ElapsedMilliseconds < 5000)
{
    for (int i=0; i < 1000000; i++)
        result += managedPtr(i, executions);
    executions++;
}
System::Console::WriteLine(".NET …
Run Code Online (Sandbox Code Playgroud)

.net performance mixed-mode delegates c++-cli

11
推荐指数
1
解决办法
1807
查看次数

防止C风格数组指针的upcast

struct Entry
{
    int Data0;
};

struct ExtendedEntry : public Entry
{
    int Data1;
};
Run Code Online (Sandbox Code Playgroud)

我有一个简单的方法,期望像这样的C样式数组指针

void Calculate(Entry* data, int count);
Run Code Online (Sandbox Code Playgroud)

将指针传递给ExtendedEntrys数组时,此方法显然失败.如何防止用户这样做?

ExtendedEntry items[50];
// [...]
Calculate(items, 50);
Run Code Online (Sandbox Code Playgroud)

这不是我追求防弹API,我只是想阻止我和我的同事再次犯同样的错误.

c++ casting

6
推荐指数
1
解决办法
122
查看次数

如何通过nuget包共享源代码,以便在.NET Core项目中使用

我想在.NET Core项目(.csproj)中使用一小段源代码(例如帮助程序类).此时,我根据不同的博客文章和官方nuget文档以多种不同的方式将源代码与NuGet打包在一起.我使用了一个nuspec文件来控制我的源文件最终会在nuget包中的位置,例如:

<files>
    <file src="*.cs" target="content/LruCache" />
    <file src="*.cs" target="contentFiles/cs/any/LruCache" />
</files>
Run Code Online (Sandbox Code Playgroud)

我没有包含任何msbuild目标文件或安装脚本.

每当我将NuGet包安装到.NET Core项目(https://docs.microsoft.com/en-us/dotnet/core/tools/csproj)时,我根本就没有得到任何东西.我的项目中不会包含任何源文件.我为<PackageReference/>.csproj(PrivateAssets等)中的节点尝试了不同的设置但没有成功.

这有可能吗?如果是这样,应该怎么做?


背景:
这样做的原因是某种钻石问题,我们有项目B和C都使用辅助类A和第三个项目D使用B和C.在这种情况下我不想处理汇编版本冲突时在B和C中使用了不同(不兼容)的A版本.

c# csproj visual-studio nuget .net-core

3
推荐指数
1
解决办法
1286
查看次数