Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Что быстрее if-if или if-else-if? / 21 сообщений из 21, страница 1 из 1
06.02.2014, 14:02
    #38551834
webber81
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Что быстрее if-if или if-else-if?
Пример1
if (a == 1) {код1}
else if (a == 2) {код2}
else if (a == 3) {код3}

Пример2
if (a == 1) {код1}
if (a == 2) {код2}
if (a == 3) {код3}
Какой пример выполнится быстрее?
...
Рейтинг: 0 / 0
06.02.2014, 14:06
    #38551841
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Что быстрее if-if или if-else-if?
webber81Какой пример выполнится быстрее?switch ))
...
Рейтинг: 0 / 0
06.02.2014, 14:06
    #38551842
Antonariy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Что быстрее if-if или if-else-if?
Если а=1 или 2, то первый, если 3, то пофиг. Надо объяснять почему?
...
Рейтинг: 0 / 0
06.02.2014, 14:07
    #38551845
Antonariy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Что быстрее if-if или if-else-if?
Shocker.Prowebber81Какой пример выполнится быстрее?switch ))Да.
...
Рейтинг: 0 / 0
06.02.2014, 14:23
    #38551876
webber81
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Что быстрее if-if или if-else-if?
if-else по скорости равно switch (в случае если а=1)
я правильно понял?
...
Рейтинг: 0 / 0
06.02.2014, 14:47
    #38551937
D129
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Что быстрее if-if или if-else-if?
webber81if-else по скорости равно switch (в случае если а=1)
я правильно понял?
Надо IL код открывать. И смотреть там.
Думаю, что режим компиляции (debug - release) может повлиять...
...
Рейтинг: 0 / 0
06.02.2014, 15:01
    #38551976
ShSerge
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Что быстрее if-if или if-else-if?
webber81Пример1
if (a == 1) {код1}
else if (a == 2) {код2}
else if (a == 3) {код3}

Пример2
if (a == 1) {код1}
if (a == 2) {код2}
if (a == 3) {код3}
Какой пример выполнится быстрее?
Пример2 быстрее, если там стоит ретурн в коде. Копеешное дело. Не стòит на это внимание обращать.
Вообще-то это очень зависит от умения программировать, а не по формальным признакам.
...
Рейтинг: 0 / 0
06.02.2014, 18:36
    #38552333
D129
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Что быстрее if-if или if-else-if?
ShSerge Не стòит на это внимание обращать.
Вообще-то это очень зависит от умения программировать, а не по формальным признакам.
+1

Есть две важные вещи - время процессора и время программиста.
Задача позитивного программиста - писать понятный код. Это экономит его время и время тех, кто будет поддреживать его код потом.
В редких случаях - время процессора важнее, и тогда надо писать максимально оптимальный код.
В большинстве случаев достаточно уметь решать проблему "умножения таблиц" - и никаких проблем с производительностью не возникнет.
...
Рейтинг: 0 / 0
06.02.2014, 18:54
    #38552367
фиганыч
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Что быстрее if-if или if-else-if?
webber81,

"быстрее" в дотнете? ну-ну
...
Рейтинг: 0 / 0
06.02.2014, 19:17
    #38552415
Где-то в степи
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Что быстрее if-if или if-else-if?
ShSerge,
А не чё что это два разных кода, даже по логике исполнения
первый пример.

if (a == 1) {код1}
else if (a == 2) {код2}
else if (a == 3) {код3}
это единый блок кода если а==1 код1 исполняется и безусловным переходом вышвыривается за за блок в низ ( что там у нас..)

а

Пример2
if (a == 1) {код1}
if (a == 2) {код2}
if (a == 3) {код3}
это три блока и если первый исполняется то остальные будит дубасится все равно..

мало того пример 2 подвержен трудно уловимым багам в логике.
...
Рейтинг: 0 / 0
06.02.2014, 22:02
    #38552561
webber81
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Что быстрее if-if или if-else-if?
По моему в экзамплах

if (a == 1) {код1}
else if (a == 2) {код2}
else if (a == 3) {код3}

и

switch(a)
case 1: {код1} break;
case 2: {код2} break;
case 3: {код3} break;

по очереди проверяются все условия, пока не дойдем до нужного.
После этого выполняется один соответствующий кодовый блок
То есть, оба экзампла должны выполняться абсолютно идентично.
Я прав?
...
Рейтинг: 0 / 0
06.02.2014, 22:10
    #38552568
Абсолют
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Что быстрее if-if или if-else-if?
Ждем очередного громкого расследования по поводу, что быстрее for или foreach !

Оставайтесь на связи!
...
Рейтинг: 0 / 0
06.02.2014, 22:12
    #38552570
Абсолют
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Что быстрее if-if или if-else-if?
Забыл повыеживаться на последок: на самом деле ничто не быстрее - это макароны, и уже с запахом.
...
Рейтинг: 0 / 0
06.02.2014, 22:40
    #38552596
Antonariy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Что быстрее if-if или if-else-if?
webber81То есть, оба экзампла должны выполняться абсолютно идентично.
Я прав?D129 сказал умную вещь: нужно смотреть IL-код. Но в VB6 тесты показывали большую скорость case'ов, чем else if. От этого у нас с Шокером остался стереотип :)
...
Рейтинг: 0 / 0
07.02.2014, 11:30
    #38552981
Antonariy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Что быстрее if-if или if-else-if?
Решил таки сравнить case и else if под дотнетом.
говнокод, я знаю
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
 Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        Dim d As Date = Now
        Dim r As Integer
        For x = 1 To 1000000000
            r = x Mod 9
            If r = 0 Then
                dummy()
            ElseIf r = 1 Then
                dummy()
            ElseIf r = 2 Then
                dummy()
            ElseIf r = 3 Then
                dummy()
            ElseIf r = 4 Then
                dummy()
            ElseIf r = 5 Then
                dummy()
            ElseIf r = 6 Then
                dummy()
            ElseIf r = 7 Then
                dummy()
            ElseIf r = 8 Then
                dummy()
            End If
        Next
        MsgBox(DateDiff(DateInterval.Second, d, Now))
        d = Now
        For x = 1 To 1000000000
            r = x Mod 9
            Select Case r
                Case 0
                    dummy()
                Case 1
                    dummy()
                Case 2
                    dummy()
                Case 3
                    dummy()
                Case 4
                    dummy()
                Case 5
                    dummy()
                Case 6
                    dummy()
                Case 7
                    dummy()
                Case 8
                    dummy()
            End Select
        Next
        MsgBox(DateDiff(DateInterval.Second, d, Now))
    End Sub

    Private Sub dummy()

    End Sub

Под дебаггером результат 16 секунд у elseif против 9 у case, при запуске exe 14 против 12. Elseif по-прежнему немного отстает (на 15%), и в алгоритмах, чувствительных к экономии на спичках, будет все же полезнее.
...
Рейтинг: 0 / 0
07.02.2014, 12:36
    #38553127
Winnipuh
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Что быстрее if-if или if-else-if?
Чудеса... D129 написал уже dsit.

Вы посмотрите во что превращается код в IL, в частности, как там раскручиются if else, а потом будете сравнивать
...
Рейтинг: 0 / 0
07.02.2014, 13:16
    #38553232
enigmatic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Что быстрее if-if или if-else-if?
webber81,

Без дизассембля-ции тут никак не обойтись!
...
Рейтинг: 0 / 0
07.02.2014, 13:18
    #38553241
enigmatic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Что быстрее if-if или if-else-if?
D129Надо IL код открывать. И смотреть там. Блин, я не был первым капитаном. Тоска-пичаль.
...
Рейтинг: 0 / 0
09.02.2014, 13:42
    #38554907
VSVLAD
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Что быстрее if-if или if-else-if?
Кому интересно поразбираться, так скажем, опытные образцы:
Код VB.NET (Компилятор VB.NET 11.0.50709.17929 из VS 2012 Express .NET 4.5)
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
Module Module1
    Sub Main()
        Dim d As Date = Now
        Dim r As Integer

        d = Now
        For x = 1 To 1000000000
            r = x Mod 9

            Select Case r
                Case 0
                    Dummy()
                Case 1
                    Dummy()
                Case 2
                    Dummy()
                Case 3
                    Dummy()
                Case 4
                    Dummy()
                Case 5
                    Dummy()
                Case 6
                    Dummy()
                Case 7
                    Dummy()
                Case 8
                    Dummy()
            End Select
        Next
        Console.WriteLine(DateDiff(DateInterval.Second, d, Now))

        For x = 1 To 1000000000
            r = x Mod 9
            If r = 0 Then
                Dummy()
            ElseIf r = 1 Then
                Dummy()
            ElseIf r = 2 Then
                Dummy()
            ElseIf r = 3 Then
                Dummy()
            ElseIf r = 4 Then
                Dummy()
            ElseIf r = 5 Then
                Dummy()
            ElseIf r = 6 Then
                Dummy()
            ElseIf r = 7 Then
                Dummy()
            ElseIf r = 8 Then
                Dummy()
            End If
        Next
        Console.WriteLine(DateDiff(DateInterval.Second, d, Now))

        Console.ReadLine()
    End Sub

    Sub Dummy()

    End Sub

End Module

Дизассемблированный код через ILSpy 2.1.0.1603 в виде VB кода
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
' ConsoleApplication3.Module1
<STAThread()>
Public Shared Sub Main()
	Dim d As DateTime = DateAndTime.Now
	d = DateAndTime.Now
	Dim x As Integer = 1
	' The following expression was wrapped in a checked-statement
	Dim arg_A4_0 As Integer
	Dim num As Integer
	Do
		Select Case x Mod 9
			Case 0
				Module1.Dummy()
			Case 1
				Module1.Dummy()
			Case 2
				Module1.Dummy()
			Case 3
				Module1.Dummy()
			Case 4
				Module1.Dummy()
			Case 5
				Module1.Dummy()
			Case 6
				Module1.Dummy()
			Case 7
				Module1.Dummy()
			Case 8
				Module1.Dummy()
		End Select
		x += 1
		arg_A4_0 = x
		num = 1000000000
	Loop While arg_A4_0 <= num
	Console.WriteLine(DateAndTime.DateDiff(DateInterval.Second, d, DateAndTime.Now, FirstDayOfWeek.Sunday, FirstWeekOfYear.Jan1))
	Dim x2 As Integer = 1
	Dim arg_178_0 As Integer
	Do
		Dim r As Integer = x2 Mod 9
		Dim flag As Boolean = r = 0
		If flag Then
			Module1.Dummy()
		Else
			flag = (r = 1)
			If flag Then
				Module1.Dummy()
			Else
				flag = (r = 2)
				If flag Then
					Module1.Dummy()
				Else
					flag = (r = 3)
					If flag Then
						Module1.Dummy()
					Else
						flag = (r = 4)
						If flag Then
							Module1.Dummy()
						Else
							flag = (r = 5)
							If flag Then
								Module1.Dummy()
							Else
								flag = (r = 6)
								If flag Then
									Module1.Dummy()
								Else
									flag = (r = 7)
									If flag Then
										Module1.Dummy()
									Else
										flag = (r = 8)
										If flag Then
											Module1.Dummy()
										End If
									End If
								End If
							End If
						End If
					End If
				End If
			End If
		End If
		x2 += 1
		arg_178_0 = x2
		num = 1000000000
	Loop While arg_178_0 <= num
	Console.WriteLine(DateAndTime.DateDiff(DateInterval.Second, d, DateAndTime.Now, FirstDayOfWeek.Sunday, FirstWeekOfYear.Jan1))
	Console.ReadLine()
End Sub

Дизассемблированный код в виде IL кода
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
163.
164.
165.
166.
167.
168.
169.
170.
171.
172.
173.
174.
175.
176.
177.
178.
179.
180.
181.
182.
183.
184.
185.
186.
187.
188.
189.
190.
191.
192.
193.
194.
195.
196.
197.
198.
199.
200.
201.
202.
203.
204.
205.
206.
207.
208.
209.
210.
211.
212.
213.
214.
215.
216.
217.
218.
219.
220.
221.
222.
223.
224.
225.
226.
227.
228.
229.
230.
231.
232.
233.
234.
.method public static 
	void Main () cil managed 
{
	.custom instance void [mscorlib]System.STAThreadAttribute::.ctor() = (
		01 00 00 00
	)
	// Method begins at RVA 0x2108
	// Code size 410 (0x19a)
	.maxstack 5
	.entrypoint
	.locals init (
		[0] valuetype [mscorlib]System.DateTime d,
		[1] int32 r,
		[2] int32 x,
		[3] int32 x,
		[4] int32 VB$t_i4$L0,
		[5] int32 VB$CG$t_i4$S0,
		[6] bool VB$CG$t_bool$S0
	)

	IL_0000: nop
	IL_0001: call valuetype [mscorlib]System.DateTime [Microsoft.VisualBasic]Microsoft.VisualBasic.DateAndTime::get_Now()
	IL_0006: stloc.0
	IL_0007: call valuetype [mscorlib]System.DateTime [Microsoft.VisualBasic]Microsoft.VisualBasic.DateAndTime::get_Now()
	IL_000c: stloc.0
	IL_000d: ldc.i4.1
	IL_000e: stloc.2
	// loop start (head: IL_000f)
		IL_000f: ldloc.2
		IL_0010: ldc.i4.s 9
		IL_0012: rem
		IL_0013: stloc.1
		IL_0014: nop
		IL_0015: ldloc.1
		IL_0016: stloc.s VB$CG$t_i4$S0
		IL_0018: ldloc.s VB$CG$t_i4$S0
		IL_001a: switch (IL_0045, IL_004e, IL_0057, IL_0060, IL_0069, IL_0072, IL_007b, IL_0084, IL_008d)

		IL_0043: br.s IL_0094

		IL_0045: nop
		IL_0046: call void ConsoleApplication3.Module1::Dummy()
		IL_004b: nop
		IL_004c: br.s IL_0094

		IL_004e: nop
		IL_004f: call void ConsoleApplication3.Module1::Dummy()
		IL_0054: nop
		IL_0055: br.s IL_0094

		IL_0057: nop
		IL_0058: call void ConsoleApplication3.Module1::Dummy()
		IL_005d: nop
		IL_005e: br.s IL_0094

		IL_0060: nop
		IL_0061: call void ConsoleApplication3.Module1::Dummy()
		IL_0066: nop
		IL_0067: br.s IL_0094

		IL_0069: nop
		IL_006a: call void ConsoleApplication3.Module1::Dummy()
		IL_006f: nop
		IL_0070: br.s IL_0094

		IL_0072: nop
		IL_0073: call void ConsoleApplication3.Module1::Dummy()
		IL_0078: nop
		IL_0079: br.s IL_0094

		IL_007b: nop
		IL_007c: call void ConsoleApplication3.Module1::Dummy()
		IL_0081: nop
		IL_0082: br.s IL_0094

		IL_0084: nop
		IL_0085: call void ConsoleApplication3.Module1::Dummy()
		IL_008a: nop
		IL_008b: br.s IL_0094

		IL_008d: nop
		IL_008e: call void ConsoleApplication3.Module1::Dummy()
		IL_0093: nop

		IL_0094: nop
		IL_0095: nop
		IL_0096: ldloc.2
		IL_0097: ldc.i4.1
		IL_0098: add.ovf
		IL_0099: stloc.2
		IL_009a: ldloc.2
		IL_009b: ldc.i4 1000000000
		IL_00a0: stloc.s VB$CG$t_i4$S0
		IL_00a2: ldloc.s VB$CG$t_i4$S0
		IL_00a4: ble IL_000f
	// end loop
	IL_00a9: ldc.i4.s 9
	IL_00ab: ldloc.0
	IL_00ac: call valuetype [mscorlib]System.DateTime [Microsoft.VisualBasic]Microsoft.VisualBasic.DateAndTime::get_Now()
	IL_00b1: ldc.i4.1
	IL_00b2: ldc.i4.1
	IL_00b3: call int64 [Microsoft.VisualBasic]Microsoft.VisualBasic.DateAndTime::DateDiff(valuetype [Microsoft.VisualBasic]Microsoft.VisualBasic.DateInterval, valuetype [mscorlib]System.DateTime, valuetype [mscorlib]System.DateTime, valuetype [Microsoft.VisualBasic]Microsoft.VisualBasic.FirstDayOfWeek, valuetype [Microsoft.VisualBasic]Microsoft.VisualBasic.FirstWeekOfYear)
	IL_00b8: call void [mscorlib]System.Console::WriteLine(int64)
	IL_00bd: nop
	IL_00be: ldc.i4.1
	IL_00bf: stloc.3
	// loop start (head: IL_00c0)
		IL_00c0: ldloc.3
		IL_00c1: ldc.i4.s 9
		IL_00c3: rem
		IL_00c4: stloc.1
		IL_00c5: ldloc.1
		IL_00c6: ldc.i4.0
		IL_00c7: ceq
		IL_00c9: stloc.s VB$CG$t_bool$S0
		IL_00cb: ldloc.s VB$CG$t_bool$S0
		IL_00cd: brfalse.s IL_00da

		IL_00cf: call void ConsoleApplication3.Module1::Dummy()
		IL_00d4: nop
		IL_00d5: br IL_0168

		IL_00da: ldloc.1
		IL_00db: ldc.i4.1
		IL_00dc: ceq
		IL_00de: stloc.s VB$CG$t_bool$S0
		IL_00e0: ldloc.s VB$CG$t_bool$S0
		IL_00e2: brfalse.s IL_00ec

		IL_00e4: call void ConsoleApplication3.Module1::Dummy()
		IL_00e9: nop
		IL_00ea: br.s IL_0168

		IL_00ec: ldloc.1
		IL_00ed: ldc.i4.2
		IL_00ee: ceq
		IL_00f0: stloc.s VB$CG$t_bool$S0
		IL_00f2: ldloc.s VB$CG$t_bool$S0
		IL_00f4: brfalse.s IL_00fe

		IL_00f6: call void ConsoleApplication3.Module1::Dummy()
		IL_00fb: nop
		IL_00fc: br.s IL_0168

		IL_00fe: ldloc.1
		IL_00ff: ldc.i4.3
		IL_0100: ceq
		IL_0102: stloc.s VB$CG$t_bool$S0
		IL_0104: ldloc.s VB$CG$t_bool$S0
		IL_0106: brfalse.s IL_0110

		IL_0108: call void ConsoleApplication3.Module1::Dummy()
		IL_010d: nop
		IL_010e: br.s IL_0168

		IL_0110: ldloc.1
		IL_0111: ldc.i4.4
		IL_0112: ceq
		IL_0114: stloc.s VB$CG$t_bool$S0
		IL_0116: ldloc.s VB$CG$t_bool$S0
		IL_0118: brfalse.s IL_0122

		IL_011a: call void ConsoleApplication3.Module1::Dummy()
		IL_011f: nop
		IL_0120: br.s IL_0168

		IL_0122: ldloc.1
		IL_0123: ldc.i4.5
		IL_0124: ceq
		IL_0126: stloc.s VB$CG$t_bool$S0
		IL_0128: ldloc.s VB$CG$t_bool$S0
		IL_012a: brfalse.s IL_0134

		IL_012c: call void ConsoleApplication3.Module1::Dummy()
		IL_0131: nop
		IL_0132: br.s IL_0168

		IL_0134: ldloc.1
		IL_0135: ldc.i4.6
		IL_0136: ceq
		IL_0138: stloc.s VB$CG$t_bool$S0
		IL_013a: ldloc.s VB$CG$t_bool$S0
		IL_013c: brfalse.s IL_0146

		IL_013e: call void ConsoleApplication3.Module1::Dummy()
		IL_0143: nop
		IL_0144: br.s IL_0168

		IL_0146: ldloc.1
		IL_0147: ldc.i4.7
		IL_0148: ceq
		IL_014a: stloc.s VB$CG$t_bool$S0
		IL_014c: ldloc.s VB$CG$t_bool$S0
		IL_014e: brfalse.s IL_0158

		IL_0150: call void ConsoleApplication3.Module1::Dummy()
		IL_0155: nop
		IL_0156: br.s IL_0168

		IL_0158: ldloc.1
		IL_0159: ldc.i4.8
		IL_015a: ceq
		IL_015c: stloc.s VB$CG$t_bool$S0
		IL_015e: ldloc.s VB$CG$t_bool$S0
		IL_0160: brfalse.s IL_0168

		IL_0162: call void ConsoleApplication3.Module1::Dummy()
		IL_0167: nop

		IL_0168: nop
		IL_0169: nop
		IL_016a: ldloc.3
		IL_016b: ldc.i4.1
		IL_016c: add.ovf
		IL_016d: stloc.3
		IL_016e: ldloc.3
		IL_016f: ldc.i4 1000000000
		IL_0174: stloc.s VB$CG$t_i4$S0
		IL_0176: ldloc.s VB$CG$t_i4$S0
		IL_0178: ble IL_00c0
	// end loop
	IL_017d: ldc.i4.s 9
	IL_017f: ldloc.0
	IL_0180: call valuetype [mscorlib]System.DateTime [Microsoft.VisualBasic]Microsoft.VisualBasic.DateAndTime::get_Now()
	IL_0185: ldc.i4.1
	IL_0186: ldc.i4.1
	IL_0187: call int64 [Microsoft.VisualBasic]Microsoft.VisualBasic.DateAndTime::DateDiff(valuetype [Microsoft.VisualBasic]Microsoft.VisualBasic.DateInterval, valuetype [mscorlib]System.DateTime, valuetype [mscorlib]System.DateTime, valuetype [Microsoft.VisualBasic]Microsoft.VisualBasic.FirstDayOfWeek, valuetype [Microsoft.VisualBasic]Microsoft.VisualBasic.FirstWeekOfYear)
	IL_018c: call void [mscorlib]System.Console::WriteLine(int64)
	IL_0191: nop
	IL_0192: call string [mscorlib]System.Console::ReadLine()
	IL_0197: pop
	IL_0198: nop
	IL_0199: ret
} // end of method Module1::Main


Как видно для Switch конструкции есть спец оператор в IL, который оптимально реализует условие
Код: c#
1.
IL_001a: switch (IL_0045, IL_004e, IL_0057, IL_0060, IL_0069, IL_0072, IL_007b, IL_0084, IL_008d)


А вот If-Then-Else в некую кашу нагенерировалось, довольно неплохо, но проскакивают операции чтения/записи в стек, которые скорее всего и тормозят.
Код: vbnet
1.
2.
IL_014a: stloc.s VB$CG$t_bool$S0
IL_014c: ldloc.s VB$CG$t_bool$S0
...
Рейтинг: 0 / 0
11.02.2014, 09:39
    #38556666
webber81
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Что быстрее if-if или if-else-if?
AntonariyПод дебаггером результат 16 секунд у elseif против 9 у case, при запуске exe 14 против 12. Elseif по-прежнему немного отстает (на 15%), и в алгоритмах, чувствительных к экономии на спичках, будет все же полезнее.

То есть получаетcя что switch под дебагером быстрее чем из exe?
Такое разве может быть?
...
Рейтинг: 0 / 0
11.02.2014, 10:41
    #38556736
Antonariy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Что быстрее if-if или if-else-if?
webber81AntonariyПод дебаггером результат 16 секунд у elseif против 9 у case, при запуске exe 14 против 12. Elseif по-прежнему немного отстает (на 15%), и в алгоритмах, чувствительных к экономии на спичках, будет все же полезнее.

То есть получаетcя что switch под дебагером быстрее чем из exe?
Такое разве может быть?Станиславский в треде! :)
...
Рейтинг: 0 / 0
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Что быстрее if-if или if-else-if? / 21 сообщений из 21, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]