【发布时间】:2018-11-18 17:58:29
【问题描述】:
考虑以下 C# 代码:
IntPtr native = GetNativeError(/* parameters here */);
return new ManagedError(native);
然后客户端代码通过以下方式检查错误:
ManagedError err = /* get it with the code above */;
if(err.IsOk()) {
/* Success */
}
这里的内存分配可以通过if 语句来节省:
IntPtr native = GetNativeError(/* parameters here */);
if(native == IntPtr.Zero) {
return null;
} else {
return new ManagedError(native);
}
然后客户端代码将检查错误如下:
ManagedError err = /* get it with the code above */;
if(err == null) {
/* Success */
}
我的问题是:哪一种方法更快?第一个有额外的内存分配。第二个有额外的if 声明。
更新:我的意思是,在成功的情况下。错误场景很少发生并且可以很慢。
【问题讨论】:
-
由于它返回 null 的次数与它分配对象的次数相比会很低,这可能是一个微不足道的性能提升。可能是“过早的优化”。
-
@MatthewWatson 不是相反吗?成功 == 很常见 == 零分配(null)
-
一般来说第二种方式更清晰,对我来说:
ManagedError不是错误但成功的是ManagedResult(参见HRESULT,S_OK)跨度> -
请注意,如果
sizeof(ManagedError) <= IntPtr.Size将其设为struct将使其“免费”(因为大小为 IntPtr.Size 的struct对 @ 没有任何开销987654336@或参考) -
不清楚您的项目要求是什么,但这是在 RCW 中完成的方式:在本机调用后检查错误代码。如果不是 S_OK,则抛出异常。该异常包含本机错误代码等。这为您提供了两全其美的体验。如果没有错误,则没有开销,如果有则异常处理的所有好处。您可以在此处阅读有关 RCW 的更多信息:msdn.microsoft.com/en-us/library/8bwh56xe(VS.100).aspx
标签: c# performance memory-management .net-core conditional