実世界の意味で違いはありません。
さまざまなターゲット用にさまざまなコンパイラによって生成されたコードを見てみましょう。
そして、比較操作のためにそれぞれが生成したものは次のとおりです。
ARMを対象とするMSVC11:
// if (x > -1) {...
00000 |cmp_gt| PROC
00000 f1b0 3fff cmp r0,#0xFFFFFFFF
00004 dd05 ble |$LN2@cmp_gt|
// if (x >= 0) {...
00024 |cmp_gte| PROC
00024 2800 cmp r0,#0
00026 db05 blt |$LN2@cmp_gte|
x64を対象とするMSVC11:
// if (x > -1) {...
cmp_gt PROC
00000 83 f9 ff cmp ecx, -1
00003 48 8d 0d 00 00 // speculative load of argument to my_puts()
00 00 lea rcx, OFFSET FLAT:$SG1359
0000a 7f 07 jg SHORT $LN5@cmp_gt
// if (x >= 0) {...
cmp_gte PROC
00000 85 c9 test ecx, ecx
00002 48 8d 0d 00 00 // speculative load of argument to my_puts()
00 00 lea rcx, OFFSET FLAT:$SG1367
00009 79 07 jns SHORT $LN5@cmp_gte
x86をターゲットとするMSVC11:
// if (x > -1) {...
_cmp_gt PROC
00000 83 7c 24 04 ff cmp DWORD PTR _x$[esp-4], -1
00005 7e 0d jle SHORT $LN2@cmp_gt
// if (x >= 0) {...
_cmp_gte PROC
00000 83 7c 24 04 00 cmp DWORD PTR _x$[esp-4], 0
00005 7c 0d jl SHORT $LN2@cmp_gte
x64をターゲットとするGCC4.6.1
// if (x > -1) {...
cmp_gt:
.seh_endprologue
test ecx, ecx
js .L2
// if (x >= 0) {...
cmp_gte:
.seh_endprologue
test ecx, ecx
js .L5
x86をターゲットとするGCC4.6.1:
// if (x > -1) {...
_cmp_gt:
mov eax, DWORD PTR [esp+4]
test eax, eax
js L2
// if (x >= 0) {...
_cmp_gte:
mov edx, DWORD PTR [esp+4]
test edx, edx
js L5
ARMをターゲットとするGCC4.4.1:
// if (x > -1) {...
cmp_gt:
.fnstart
.LFB0:
cmp r0, #0
blt .L8
// if (x >= 0) {...
cmp_gte:
.fnstart
.LFB1:
cmp r0, #0
blt .L2
ARMCortex-M3を対象とするIAR5.20:
// if (x > -1) {...
cmp_gt:
80B5 PUSH {R7,LR}
.... LDR.N R1,??DataTable1 ;; `?<Constant "non-negative">`
0028 CMP R0,#+0
01D4 BMI.N ??cmp_gt_0
// if (x >= 0) {...
cmp_gte:
80B5 PUSH {R7,LR}
.... LDR.N R1,??DataTable1 ;; `?<Constant "non-negative">`
0028 CMP R0,#+0
01D4 BMI.N ??cmp_gte_0
あなたがまだ私と一緒にいるなら、ここに評価(x > -1)
と(x >= 0)
それが現れる間のメモの違いがあります:
- ARMをターゲットとするMSVCは、 vsforを使用
cmp r0,#0xFFFFFFFF
します。最初の命令のオペコードは2バイト長くなっています。それはもう少し時間がかかるかもしれないと思うので、これを利点と呼びます(x > -1)
cmp r0,#0
(x >= 0)
(x >= 0)
- x86をターゲットとするMSVCは、 vsforを使用
cmp ecx, -1
します。最初の命令のオペコードは1バイト長くなっています。それはもう少し時間がかかるかもしれないと思うので、これを利点と呼びます(x > -1)
test ecx, ecx
(x >= 0)
(x >= 0)
GCCとIARは、2種類の比較のために同一のマシンコードを生成したことに注意してください(どちらのレジスタが使用されたかを除いて)。したがって、この調査によると、(x >= 0)
「より速く」なる可能性は非常に低いようです。しかし、最小限に短いオペコードバイトエンコーディングが持つ可能性のある(そして私が強調するかもしれない)利点が何であれ、他の要因によって確かに完全に影が薄くなります。
JavaまたはC#のjitted出力に何か違うものを見つけたら、私は驚きます。8ビットAVRのような非常に小さなターゲットでも、注意の違いが見つかるとは思えません。
つまり、このマイクロ最適化について心配する必要はありません。ここでの私の書き込みは、私の生涯でそれらを実行するすべてのCPUにわたって蓄積されたこれらの式のパフォーマンスの違いによって費やされるよりも、すでに多くの時間を費やしていると思います。性能の違いを測定できる方は、亜原子粒子の振る舞いなど、もっと重要なことに力を入れてください。