2009-11-24 2 views
-3

У меня есть скрипт C# .NET 2.0, и я хочу знать, почему следующий код будет быстрее, чем цикл while в одном и том же виде.C#, который быстрее выполняет/пока или для?

private double getStop(double avgPrice, bool longTrading) 
    { 
     double stopS = 0.0; 
     double stopL = 0.0; 

     for (int i = 0; i < 13; i++) 
     { 
      if (i == 0 || i == 12) 
      { 
       stopS = 0.0; 
       stopL = 0.0; 
      } 
      else 
      { 
       if ((lines[i] - ((lines[i] - lines[i - 1])/2)) < avgPrice && avgPrice < (lines[i + 1] - ((lines[i + 1] - lines[i])/2))) 
       { 
        if (avgPrice < lines[i]) 
        { 
         stopL = (lines[i] - ((lines[i] - lines[i - 1])/2)); 
         stopS = lines[i]; 
        } else { 
         stopL = lines[i]; 
         stopS = (lines[i + 1] - ((lines[i + 1] - lines[i])/2)); 
        } 
       } 
      } 
     } 

     if (longTrading) 
     { 
      return stopL; 
     } else { 
      return stopS; 
     } 
    } 

Кроме того, было бы проще просто явно указать инструкцию if, а не делать их внутри цикла for?

Будучи тем, что на это был дан ответ так быстро, почему это работает намного медленнее, чем приведенный выше код?

private double getStop(double avgPrice, bool longTrading) 
    { 
     double stopS = 0.0; 
     double stopL = 0.0; 

     for (int i = 0; i < 13; i++) 
     { 
      if (i == 0 || i == 12) 
      { 
       stopS = 0.0; 
       stopL = 0.0; 
       skip = true; 
      } 

      if (!skip && (lines[i] - ((lines[i] - lines[i - 1])/2)) < avgPrice && avgPrice < (lines[i + 1] - ((lines[i + 1] - lines[i])/2))) 
       { 
        if (avgPrice < lines[i]) 
        { 
         stopL = (lines[i] - ((lines[i] - lines[i - 1])/2)); 
         stopS = lines[i]; 
        } else { 
         stopL = lines[i]; 
         stopS = (lines[i + 1] - ((lines[i + 1] - lines[i])/2)); 
        } 
       } 
      } 
      skip = false; 
     } 

     if (longTrading) 
     { 
      return stopL; 
     } else { 
      return stopS; 
     } 
    } 

ответ

3

Они должны быть по существу эквивалентными. Ваш цикл 'for' оценивается как:

int i = 0; 
while (i < 13) 
{ 
    //all other stuff 
    i++; 
}; 
+0

+1: В общем, я ожидал бы, что компилятор или интерпретатор для преобразования сахара 'for' в' while'. – eyelidlessness

2

Варианты петель не слишком разные, это зависит от контекста и языка программирования.

Но мое мнение таково, for утверждение не не делать до constaint (ов)/совпадают, поэтому он должен быть быстрее, чем делать/время.

+2

В моем мире 0 всегда меньше 13, и поэтому цикл цикла выше всегда будет выполняться. Кроме того, в любом случае, это не цикл для синтаксического сахара для цикла do-while? Я просто что-то пропустил в вашем объяснении? –

+0

lc, я не знаю, как какой-либо данный язык реализует 'for' или' while' или 'do' /' while' за кулисами, но интуитивно кажется, что цикл 'for' представляет собой специализированный цикл while while (а не 'do' /' while') и, по крайней мере, на языках, которые я использую, если вы передаете цикл 'for' - граничный параметр, который вычисляет false при первом выполнении, цикл никогда не запускается. Например. 'for (i = 10; i <9; i ++) {/ * Это никогда не запускается * /}'. Это поведение цикла while. – eyelidlessness

4

Разница в производительности должна быть незначительной, но цикл for более ясен, поэтому я бы пошел с этим.

+0

На самом деле я получаю очень большое улучшение. Я перешел с 0,50 итераций в секунду до 0,4, и единственный код, который я изменил, был от do/while до for. –

+0

На секунду я не верю, что вы получаете только 0,05 итераций в секунду. –

+0

Это не весь мой код, и он собирает обширный объем данных, поэтому я не уверен, почему вы этого не сделали. –

Смежные вопросы