试试{} Catch优化?

SsJ*_*sto 0 c# algorithm optimization try-catch game-engine

我对有关例外的最佳做法有疑问.本周末,我正在研究我的小游戏,我发现自己想知道是否最好使用IF或TRY来验证NULL ...以下是同一函数的两个变体:

这是我使用IF的代码

//Using IF
void ParseGamePad() {
    GamePadData pad = GamePad.GetDate(0);
    foreach(var btn in Enum.GetValues(GamePad.BUTTONS)) {
        if(myArray.ContainsKey(btn))
            if(myArray[btn]!=null)
                myArray[btn](); //Execute function reference in array
    }
    return;
}
Run Code Online (Sandbox Code Playgroud)

以下是代码的含义 Try{}Catch

//Using TRY
void ParseGamePad() {
    GamePadData pad = GamePad.GetDate(0);
    foreach(var btn in Enum.GetValues(GamePad.BUTTONS)) {
        try {
            myArray[btn](); //Execute function reference in array
        } catch(System.Exception e) {
            // Nothing to do here
        }
    }
    return;
}
Run Code Online (Sandbox Code Playgroud)

我的方法IF是,TRY当元素不存在于数组中时,块比块更快,而TRY元素存在时更快,但当捕获异常时更慢.

你们会做什么?

PS:这个项目是在嵌入式系统上,因此CPU和RAM是一个因素.

D S*_*ley 5

不要在程序流程中使用异常 - 它们用于捕获特殊情况.如果myArray[btn] 不应该为空则抛出时,一个异常会被罚款,但追赶它,看它是否是空的是不是一个最佳实践(加,捉Exception将涵盖很多可能的条件下,不只是当值null或不找到).

就性能而言,检查一个对象是否非常便宜,所以我不希望在正常情况下有任何显着的性能差异.

您可以使用以下命令将索引查找次数减少2(这可以显着提高性能)TryGetValue:

foreach(var btn in Enum.GetValues(GamePad.BUTTONS)) {
    Action<Button> func;   // Guessing on the type here
    bool found = myArray.TryGetValue(btn, out func);
    if(found && func != null)
        func(); //Execute function reference in array
}
Run Code Online (Sandbox Code Playgroud)