对于我的C++/CLI项目,我只是尝试测量C++/CLI函数指针与.NET代理的成本.
我的期望是,C++/CLI函数指针比.NET代理更快.所以我的测试分别计算整个5秒内.NET委托和本机函数指针的调用次数.
现在结果对我来说(现在仍然令人震惊):
这意味着,本机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) 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,我只是想阻止我和我的同事再次犯同样的错误.
我想在.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版本.