2015-11-19 2 views
0

Мне нужно выбрать способ написать фрагмент кода, который будет повторяться очень сильно, поэтому я хочу, чтобы он был как можно быстрее.Вложенные If - ElseIf - Выберите случай

Это мой код (на данный момент):

For Cel As Short = 0 To Cels - 1 
    Rw = Int(Cel/3) + 1 
    Col = Cel - ((Rw - 1) * 3) + 1 
    RifTxt = TabW(RifTW("Pi")).Cells(Cel) 
    If Col = 1 Then 
     RowArr(Col) = RifTxt 
    Else 
     If DateTime.TryParse(RifTxt, culture, Styles, DateResult) Then 
      RowArr(Col) = DateResult.ToString("yyyy-MM-dd") 
     Else 
      RowArr(Col) = "0000-00-00" 
     End If 
     If Col = 3 Then 
      RowArr(3) = Rw 
      Pi_W.Rows.Add (RowArr) 
     End If 
    End If 
Next Cel 

Я интересно, изменяя его (с помощью ELSEIF Или Select Case), как показано ниже:

Использование ElseIf

For Cel As Short = 0 To Cels - 1 
    Rw = Int(Cel/3) + 1 
    Col = Cel - ((Rw - 1) * 3) + 1 
    RifTxt = TabW(RifTW("Pi")).Cells(Cel) 
    If Col = 1 Then 
     RowArr(Col) = RifTxt 
    ElseIf Col = 2 
     If DateTime.TryParse(RifTxt, culture, Styles, DateResult) Then 
      RowArr(Col) = DateResult.ToString("yyyy-MM-dd") 
     Else 
      RowArr(Col) = "0000-00-00" 
     End If 
    ElseIf Col = 3 Then 
     If DateTime.TryParse(RifTxt, culture, Styles, DateResult) Then 
      RowArr(Col) = DateResult.ToString("yyyy-MM-dd") 
     Else 
      RowArr(Col) = "0000-00-00" 
     End If 
     RowArr(3) = Rw 
     Pi_W.Rows.Add (RowArr) 
    End If 
Next Cel 

Или с помощью Select Case:

For Cel As Short = 0 To Cels - 1 
    Rw = Int(Cel/3) + 1 
    Col = Cel - ((Rw - 1) * 3) + 1 
    RifTxt = TabW(RifTW("Pi")).Cells(Cel) 
    Select Case Col 
    Case is = 1 Then 
     RowArr(Col) = RifTxt 
    Case is = 2 
     If DateTime.TryParse(RifTxt, culture, Styles, DateResult) Then 
      RowArr(Col) = DateResult.ToString("yyyy-MM-dd") 
     Else 
      RowArr(Col) = "0000-00-00" 
     End If 
    Case is = 3 Then 
     If DateTime.TryParse(RifTxt, culture, Styles, DateResult) Then 
      RowArr(Col) = DateResult.ToString("yyyy-MM-dd") 
     Else 
      RowArr(Col) = "0000-00-00" 
     End If 
     RowArr(3) = Rw 
     Pi_W.Rows.Add (RowArr) 
    End Select 
Next Cel 

Я попытался сравнить три метода на .netFiddle, но я не уверен в результатах.

Не могли бы вы предложить мне правильный выбор?

+0

Я бы использовал функцию, которая возвращала значение, основанное на переменной 'Col', которую вы передаете ей. Это сделало бы это более удобочитаемым. – OneFineDay

+0

у вас есть код, у NET есть секундомер hi-res, просто выполняйте каждый цикл и время их (сделайте это в режиме Release). Возможно, вы захотите изменить итератор цикла на Int32/Integer. – Plutonix

+0

@Plutonix Вы говорите мне, что использование 'для Cel As Integer' сделает код быстрее, чем использование' For Cel As Short'? – genespos

ответ

0

В этом случае ваши примеры Select и If, скорее всего, собираются скомпилировать один и тот же машинный код с точно такой же производительностью.

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

Как всегда, если вы хотите знать, что работает лучше, попробуйте и посмотрите.