Поскольку ответ будет зависеть от вашей архитектуры, давайте взглянем на сгенерированный код на x86-64 (с gcc -O3):
#include <math.h>
int t_gt(int x) { // note! not equivalent to the others
return abs(x) > 1;
}
int t_ge(int x) {
return abs(x) >= 1;
}
int t_ne(int x) {
return abs(x) != 1;
}
становится:
Disassembly of section .text:
0000000000000000 <t_gt>:
#include <math.h>
int t_gt(int x) {
0: 89 f8 mov %edi,%eax
2: c1 f8 1f sar $0x1f,%eax
5: 31 c7 xor %eax,%edi
7: 29 c7 sub %eax,%edi
9: 31 c0 xor %eax,%eax
b: 83 ff 01 cmp $0x1,%edi
e: 0f 9f c0 setg %al
return abs(x) > 1;
}
11: c3 retq
12: 66 66 66 66 66 2e 0f nopw %cs:0x0(%rax,%rax,1)
19: 1f 84 00 00 00 00 00
0000000000000020 <t_ge>:
int t_ge(int x) {
20: 89 f8 mov %edi,%eax
22: c1 f8 1f sar $0x1f,%eax
25: 31 c7 xor %eax,%edi
27: 29 c7 sub %eax,%edi
29: 31 c0 xor %eax,%eax
2b: 85 ff test %edi,%edi
2d: 0f 9f c0 setg %al
return abs(x) >= 1;
}
30: c3 retq
31: 66 66 66 66 66 66 2e nopw %cs:0x0(%rax,%rax,1)
38: 0f 1f 84 00 00 00 00
3f: 00
0000000000000040 <t_ne>:
int t_ne(int x) {
40: 89 f8 mov %edi,%eax
42: c1 f8 1f sar $0x1f,%eax
45: 31 c7 xor %eax,%edi
47: 29 c7 sub %eax,%edi
49: 31 c0 xor %eax,%eax
4b: 83 ff 01 cmp $0x1,%edi
4e: 0f 95 c0 setne %al
return abs(x) != 1;
}
51: c3 retq
Как видите, есть два различия:
- Коды условий в установленных * операциях отличаются. Это скорее всего не повлияет на скорость.
- Для t_ge используется двухбайтовый регистровый тест (AND), в то время как два других используют cmp (вычитание) и буквенный однобайтовый операнд для сравнения.
Хотя разница между различными вариантами set * и test и cmp, вероятно, равна нулю, дополнительный однобайтовый операнд для cmp может снизить производительность на неизмеримо малую величину.
Конечно, лучшая производительность будет достигнута, если полностью избавиться от бессмысленного abs ():
0000000000000060 <t_ne2>:
int t_ne2(int x) {
60: 31 c0 xor %eax,%eax
62: 85 ff test %edi,%edi
64: 0f 95 c0 setne %al
return (x != 0);
}
67: c3 retq
Имейте в виду, что эти выводы могут не относиться к другим архитектурам; однако потеря пресса наверняка будет быстрее где угодно.