इस कोड है कि मैं परीक्षण किया है:जीसीसी इस रिकर्सिव फाइबोनैकी कोड में क्लैंग की तुलना में एक तेज प्रोग्राम क्यों उत्पन्न करता है?
#include <iostream>
#include <chrono>
using namespace std;
#define CHRONO_NOW chrono::high_resolution_clock::now()
#define CHRONO_DURATION(first,last) chrono::duration_cast<chrono::duration<double>>(last-first).count()
int fib(int n) {
if (n<2) return n;
return fib(n-1) + fib(n-2);
}
int main() {
auto t0 = CHRONO_NOW;
cout << fib(45) << endl;
cout << CHRONO_DURATION(t0, CHRONO_NOW) << endl;
return 0;
}
बेशक
, वहाँ फिबोनैकी संख्या की गणना के बहुत तेजी से तरीके हैं, लेकिन यह एक अच्छा थोड़ा तनाव परीक्षण है कि पुनरावर्ती क्रिया कॉल पर केंद्रित है। समय मापने के लिए क्रोोनो के उपयोग के अलावा, कोड के लिए कुछ और नहीं है।
सबसे पहले मैंने ओओ एक्स पर एक्सकोड में दो बार परीक्षण किया (इसलिए यह क्लैंग) है, ओओ 3 अनुकूलन का उपयोग कर। इसे चलाने में लगभग 9 सेकंड लग गए।
फिर, मैंने उबंटू (जीओ ++) पर जीसीसी (जी ++) के साथ एक ही कोड संकलित किया, और उस संस्करण को चलाने के लिए केवल 6.3 सेकंड लग गए! इसके अलावा, मैं अपने मैक पर वर्चुअलबॉक्स के अंदर उबंटू चला रहा था, जो केवल प्रदर्शन को नकारात्मक रूप से प्रभावित कर सकता है, अगर बिलकुल भी।
तो वहाँतुम जाओ: ओएस पर
बजना एक्स -> ~ 9 उबंटू पर सेकेंड
जीसीसी VirtualBox में -> ~ 6.3 सेकेंड।
मुझे पता है कि ये पूरी तरह से अलग कंपाइलर हैं इसलिए वे अलग-अलग सामान करते हैं, लेकिन जीसीसी और क्लैंग की विशेषता वाले सभी परीक्षणों में केवल एक अंतर दिखाई देता है, और कुछ मामलों में, अंतर एक और तरीका था (झुकाव तेजी से हो रहा है)।
तो क्या कोई तार्किक स्पष्टीकरण है कि जीसीसी इस विशेष उदाहरण में मील से क्यों घिरा हुआ है?
पर कॉल करने के लिए 20 से अधिक लेबल वाले केवल एक ही कॉल है, क्या आपने असेंबली आउटपुट की जांच की है? और क्लैंग और जीसीसी का संस्करण क्या है? –
इन परिभाषाओं का उपयोग न करें।'उपयोग' निर्देश का यही अर्थ है: 'chrono_time_point = chrono :: high_resolution_clock :: time_point; ' – Cubic
उत्पन्न कोड को देखें, यह एक साधारण कार्य है –