8

私は、大規模なデータセット(平均で1,000万データポイント)に対してかなり複雑な科学式を使用するC#.NETアプリケーションに取り組んでいます。私がしていることの一部は、数式の実装を可能な限り最適化することを必要とします。

ある数式の実装でgotoが使用されていることに気づきました。それで、gotoは他のフロー制御構造よりも遅いのでしょうか。

4

4 に答える 4

12

gotoは他のフロー制御構造よりも遅いですか?

いいえ。他のすべてのフロー制御構造は基本的にgotoとにかくです。

于 2012-04-19T17:32:02.817 に答える
4

C#のgoto命令は、他のどの制御フロー構造よりも遅くはありません。実際、制御フロー構造の大部分(if、while、forなど...)は、の観点から実装されていgotoます。

例えば:

if (someExpr) { 
  Console.WriteLine("here");
}
Console.WriteLine("there");

基本的に次のようにコンパイルされます

gotoIf !someExpr theLabel;
Console.WriteLine("here");
theLabel:
Console.WriteLine("there");
于 2012-04-19T17:32:47.153 に答える
4

ある数式の実装でgotoが使用されていることに気づきました。それで、gotoは他のフロー制御構造よりも遅いのでしょうか。

goto他のフロー制御メカニズムよりも遅くなることはありません。ほとんどのフロー制御メカニズムと同様に、br.s(または同様の)MSIL命令にコンパイルされます。ただし、goto少し速くなる場合があります。それらは主に、ネストされたループの使用breakとその内部を含む状況に限定されます。continue次のコードを検討してください。

bool condition = false;
for (int i = 0; i < BigNumber; i++)
{
    for (int j = 0; j < i; j++)
    {
        for (int k = 0; k < j; k++)
        {
            condition = Evaluate(i, j, k);
            if (condition)
            {
              // break out of everything
            }
        }
    }
}

あなたが全体から抜け出すことができるさまざまな方法があります。これが1つの方法です。

bool condition = false;
for (int i = 0; i < BigNumber; i++)
{
    for (int j = 0; j < i; j++)
    {
        for (int k = 0; k < j; k++)
        {
            condition = Evaluate(i, j, k);
            if (condition) break;
        }
        if (condition) break;
    }
    if (condition) break;
}

condition問題は、各ループがフラグをチェックする必要があることです。これをaでリファクタリングして、goto起動を少し効率的にし、もう少しエレガントにすることができます。

for (int i = 0; i < BigNumber; i++)
{
    for (int j = 0; j < i; j++)
    {
        for (int k = 0; k < j; k++)
        {
            if (Evaluate(i, j, k)) goto BAILOUT;
        }
    }
}
BAILOUT:
于 2012-04-23T16:01:45.197 に答える
1

ifsおよびはコンパイラによって内部的にsforに変換されるため、 sよりも高速ではありませんgotogoto

于 2012-04-19T17:32:49.687 に答える