टी एल; डॉ
वहाँ प्रतीत होता है छोटे-से-चार ऑपरेटरों के बीच का अंतर, वे सब मेरे लिए एक ही समय (विभिन्न प्रणालियों पर अलग हो सकता है!) के बारे में में प्रदर्शन के रूप में। इसलिए, जब संदेह हो, तो ऑपरेटर का उपयोग करें जो स्थिति के लिए सबसे अधिक समझ में आता है (विशेष रूप से जब सी ++ के साथ गड़बड़ हो)।
मान लिया जाये कि पूर्णांक तुलना:
जहां तक विधानसभा उत्पन्न, परिणाम मंच निर्भर कर रहे हैं
तो, आगे की हलचल के बिना, यहाँ लंबे व्याख्या है। अपने कंप्यूटर (एप्पल LLVM संकलक 4.0, x86_64), परिणामों पर (इस प्रकार उत्पन्न विधानसभा है):
a < b (uses 'setl'):
movl $10, -8(%rbp)
movl $15, -12(%rbp)
movl -8(%rbp), %eax
cmpl -12(%rbp), %eax
setl %cl
andb $1, %cl
movzbl %cl, %eax
popq %rbp
ret
a <= b (uses 'setle'):
movl $10, -8(%rbp)
movl $15, -12(%rbp)
movl -8(%rbp), %eax
cmpl -12(%rbp), %eax
setle %cl
andb $1, %cl
movzbl %cl, %eax
popq %rbp
ret
a > b (uses 'setg'):
movl $10, -8(%rbp)
movl $15, -12(%rbp)
movl -8(%rbp), %eax
cmpl -12(%rbp), %eax
setg %cl
andb $1, %cl
movzbl %cl, %eax
popq %rbp
ret
a >= b (uses 'setge'):
movl $10, -8(%rbp)
movl $15, -12(%rbp)
movl -8(%rbp), %eax
cmpl -12(%rbp), %eax
setge %cl
andb $1, %cl
movzbl %cl, %eax
popq %rbp
ret
कौन वास्तव में मुझे ज्यादा नहीं बता रही है। तो, हम एक बेंचमार्क पर जाते हैं:
और महिलाओं & सज्जनो, परिणाम हैं, मैंने निम्नलिखित परीक्षण कार्यक्रम बनाया है (मुझे पता है कि 'घड़ी' इस तरह के परिणामों की गणना करने का सबसे अच्छा तरीका नहीं है, लेकिन यह अब के लिए करना होगा)।
#include <time.h>
#include <stdio.h>
#define ITERS 100000000
int v = 0;
void testL()
{
clock_t start = clock();
v = 0;
for (int i = 0; i < ITERS; i++) {
v = i < v;
}
printf("%s: %lu\n", __FUNCTION__, clock() - start);
}
void testLE()
{
clock_t start = clock();
v = 0;
for (int i = 0; i < ITERS; i++)
{
v = i <= v;
}
printf("%s: %lu\n", __FUNCTION__, clock() - start);
}
void testG()
{
clock_t start = clock();
v = 0;
for (int i = 0; i < ITERS; i++) {
v = i > v;
}
printf("%s: %lu\n", __FUNCTION__, clock() - start);
}
void testGE()
{
clock_t start = clock();
v = 0;
for (int i = 0; i < ITERS; i++) {
v = i >= v;
}
printf("%s: %lu\n", __FUNCTION__, clock() - start);
}
int main()
{
testL();
testLE();
testG();
testGE();
}
कौन सा, मेरी मशीन (-O0
साथ संकलित) पर, मुझे इस (5 अलग रन) देता है:
testL: 337848
testLE: 338237
testG: 337888
testGE: 337787
testL: 337768
testLE: 338110
testG: 337406
testGE: 337926
testL: 338958
testLE: 338948
testG: 337705
testGE: 337829
testL: 339805
testLE: 339634
testG: 337413
testGE: 337900
testL: 340490
testLE: 339030
testG: 337298
testGE: 337593
मैं तर्क है कि इन ऑपरेटरों के बीच मतभेद पर सबसे अच्छा छोटे हैं, और डॉन एक आधुनिक कंप्यूटिंग दुनिया में ज्यादा वजन नहीं है।
मुझे लगता है कि वे दोनों आर्किटेक्चर में एक ही निर्देश के लिए संकलित हैं, लेकिन जवाब है: कौन परवाह करता है? – meagar
यदि आप यही पूछते हैं तो वे असेंबली निर्देशों के मामले में लगभग बराबर हैं। –
मैं आपके प्रश्न के पीछे की भावना को समझता हूं, लेकिन: क्या आप इसे अकादमिक हित से पूछते हैं, या क्योंकि आपको लगता है कि इससे आपके ऐप के प्रदर्शन पर असर पड़ सकता है? यह नहीं होगा अंतर, यदि मौजूद है, तो आपके ऐप के अन्य कारकों द्वारा ** ** ** पूरी तरह से ** मुद्रित होगा। 2, या 10 के कारक से नहीं, लेकिन 1 मीटर या उससे अधिक तक। मैं शर्त लगाऊंगा कि आप इसे मापने में सक्षम नहीं होंगे। –