Ответ лежит в ассемблерном коде, сгенерированном gcc (-g
и -O2
).Две функции принимают value
в качестве аргумента, который сначала запрашивается у пользователя (чтобы gcc не удалял неиспользуемые фрагменты кода - иначе говоря, удаление мертвого кода ).Конечно, часть printf
одинакова для обеих функций и оптимизирована для gcc (обе), поэтому она возвращается сразу после печати.Таким образом, значительная часть - начало обеих функций.Давайте посмотрим на них:
0x080484d0 <+0>: push %ebp # -
0x080484d1 <+1>: mov %esp,%ebp # |- standard prologue
0x080484d3 <+3>: sub $0x28,%esp # -
0x080484d6 <+6>: mov 0x8(%ebp),%eax # get argument
0x080484d9 <+9>: movl $0x80484f8,-0x14(%ebp) # set up labels array
0x080484e0 <+16>: movl $0x8048510,-0x10(%ebp)
0x080484e7 <+23>: movl $0x8048528,-0xc(%ebp)
0x080484ee <+30>: jmp *-0x14(%ebp,%eax,4) # jump to appropriate sect.
0x080484f2 <+34>: lea 0x0(%esi),%esi
0x08048470 <+0>: push %ebp # -
0x08048471 <+1>: mov %esp,%ebp # |- standard prologue
0x08048473 <+3>: sub $0x18,%esp # -
0x08048476 <+6>: mov 0x8(%ebp),%eax # get argument
0x08048479 <+9>: cmp $0x1,%eax
0x0804847c <+12>: je 0x80484b8 <switchFunc+72> # jump here if value == 1
0x0804847e <+14>: cmp $0x2,%eax
0x08048481 <+17>: je 0x80484a0 <switchFunc+48> # if value == 2
0x08048483 <+19>: test %eax,%eax
0x08048485 <+21>: jne 0x804849b <switchFunc+43> # if value != 0 return
Оба фрагментаесть «медленная часть»: первый тратит большую часть времени на настройку массива меток, а второй медленный, решая, какой путь выбрать.Так что, по сути, время их выполнения почти одинаково.
Какой из них лучше?Второй, с конструктом switch
.Это стандарт С, гораздо более читаемый, понятный и понятный.