c# - MethodImplOptions.AggressiveInlining 是否可以防止昂贵的参数在不使用时进行评估?
问题描述
说我有一个功能Log
:
void Log(string message, LogLevel logLevel) {
if (logLevel >= chosenLogLevel)
Console.WriteLine(message);
}
我用一个昂贵的评估参数来调用它:
Log(SlowFunction(), someLogLevel);
如果我要申请MethodImplOptions.AggressiveInlining
,Log
是否会SlowFunction
被调用 iflogLevel
小于chosenLogLevel
?
解决方案
内联在这里无济于事
您当前的代码是这样的
void Log(string message, LogLevel logLevel) {
if (logLevel >= chosenLogLevel)
Console.WriteLine(message);
}
void Foo()
{
Log(SlowFunction(), someLogLevel);
}
内联后变成:
void Foo()
{
var message = SlowFunction();
var logLevel = someLogLevel;
if (logLevel >= chosenLogLevel)
Console.WriteLine(message);
}
logLevel
然后可以进一步内联,但SlowFunction()
根据定义必须在检查之前调用。
避免这种情况的一种方法是传递message
为Func<string>
:
void Log(Func<string> message, LogLevel logLevel) {
if (logLevel >= chosenLogLevel)
Console.WriteLine(message());
}
void Foo()
{
Log(SlowFunction, someLogLevel);
}
推荐阅读
- javascript - 如何通过查询在选择框中获取api数据
- python - 类中的 ExitStack
- java - javax.persistence.PersistenceException:org.hibernate.PersistentObjectException:分离的实体传递给持久数据库“世界”
- sql-server - SQL Server 是否支持同时通过 List 和 Range Partition 进行表分区?
- swift - 如何从 Alamofire 响应中获取错误代码?
- regex - 正则表达式替换由空格或制表符分隔的数字
- azure - 我可以为不同的 Azure 自动化帐户使用相同的运行帐户吗?
- woocommerce - Woocommerce 结帐页面编辑
- reactjs - 如何将道具发送到其他文件?
- amazon-web-services - 图关系的 ElasticSearch/Neptune 替代解决方案