हर्ब सटर के आकर्षक व्याख्यान Not your father's C++ से प्रेरित, मैंने माइक्रोसॉफ्ट के विजुअल स्टूडियो 2010 का उपयोग कर सी ++ के नवीनतम संस्करण पर एक और नज़र डालने का फैसला किया। मुझे विशेष रूप से हर्ब के इस दावे से रूचि थी कि सी ++ "सुरक्षित और तेज़" है क्योंकि मैं बहुत सारे प्रदर्शन-महत्वपूर्ण कोड लिखें।सुरक्षित और तेज़ एफएफटी
बेंचमार्क के रूप में, मैंने विभिन्न भाषाओं में एक ही साधारण एफएफटी एल्गोरिदम लिखने का प्रयास करने का फैसला किया।
#include <complex>
#include <vector>
using namespace std;
// Must provide type or MSVC++ barfs with "ambiguous call to overloaded function"
double pi = 4 * atan(1.0);
void fft(int sign, vector<complex<double>> &zs) {
unsigned int j=0;
// Warning about signed vs unsigned comparison
for(unsigned int i=0; i<zs.size()-1; ++i) {
if (i < j) {
auto t = zs.at(i);
zs.at(i) = zs.at(j);
zs.at(j) = t;
}
int m=zs.size()/2;
j^=m;
while ((j & m) == 0) { m/=2; j^=m; }
}
for(unsigned int j=1; j<zs.size(); j*=2)
for(unsigned int m=0; m<j; ++m) {
auto t = pi * sign * m/j;
auto w = complex<double>(cos(t), sin(t));
for(unsigned int i = m; i<zs.size(); i+=2*j) {
complex<double> zi = zs.at(i), t = w * zs.at(i + j);
zs.at(i) = zi + t;
zs.at(i + j) = zi - t;
}
}
}
ध्यान दें कि यह समारोह केवल n
तत्व वैक्टर के लिए काम करता है, जहां n
एक अभिन्न है:
मैं का उपयोग करता है निर्मित में complex
प्रकार और vector
संग्रह निम्नलिखित सी ++ 11 कोड के साथ आया था दो की शक्ति। कोई भी n
के लिए काम करता है जो तेजी से एफएफटी कोड की तलाश में है FFTW पर देखना चाहिए।
मैं यह समझ के रूप में, पारंपरिक xs[i]
एक vector
अनुक्रमण के लिए सी से वाक्य रचना सीमा जाँच करता है नहीं है, परिणामस्वरूप, सुरक्षित स्मृति नहीं है और इस तरह के गैर नियतात्मक भ्रष्टाचार और स्मृति पहुँच उल्लंघन के रूप में स्मृति त्रुटियों की एक स्रोत हो सकता है । तो मैंने इसके बजाय xs.at(i)
का उपयोग किया।
अब, मैं चाहता हूं कि यह कोड "सुरक्षित और तेज़" हो, लेकिन मैं सी ++ 11 विशेषज्ञ नहीं हूं इसलिए मैं इस कोड में सुधार के लिए पूछना चाहता हूं जो इसे अधिक मूर्ख या कुशल बना देगा?
* "मैं इस कोड में सुधार के लिए पूछना चाहता हूं जो इसे अधिक बेवकूफ या कुशल बना देगा?" * - शायद [codereview] (http://codereview.stackexchange.com) पूछने के लिए एक बेहतर जगह होगी समीक्षा के लिए। – Flexo
अधिकांश, यदि नहीं, तो मानक पुस्तकालय गैर-अनुकूलित/डीबग मोड में इटरेटर/इंडेक्स डीबगिंग प्रदान करते हैं, जो 'ऑपरेटर []' के साथ भी जांच करता है। रिलीज मोड में, वे अक्षम हैं, इसलिए आपको पूरा प्रदर्शन मिलता है। एफडब्ल्यूआईडब्ल्यू, एमएसवीसी पुस्तकालय उनमें से एक है। और यदि आप सुनिश्चित नहीं हैं कि कोई अन्य lib भी करता है, तो आप केवल एक सहायक फ़ंक्शन लिख सकते हैं जो रिलीज मोड में 'at'' और 'ऑपरेटर []' को कॉल करता है। – Xeo
आपने किस अन्य भाषा का उपयोग किया था? एक तुलना देखना दिलचस्प होगा। –