2011-09-25 93 views
0

我正在寫數值代碼,其中定義矢量操作很有用。例如,如果x和y是充滿浮點數的n長向量,那麼令x^y導致y的第i個元素等於x的第i個元素的某個任意函數是很好的。這樣做的一個簡單方法是:C++運算符()優化矢量

#include <vector> 
#include <stdio.h> 
#include <ctime> 

using namespace std; 

template <typename T> 
void operator^(vector<T> A, vector<T> B){ 
    typename vector<T>::iterator a = A.begin(); 
    typename vector<T>::iterator b = B.begin(); 
    while(a!=A.end()){ 
    *b = 2*(*a); 
    a++; b++; 
    } 
//for (uint i=0; i<A.size(); i++) 
    //B[i] = 2*A[i]; 
} 

int main(int argc, char** argv){ 

    int n = 10000; 
    int numRuns = 100000; 
    vector<float> A; 
    for (int i=0; i<n; i++) 
    A.push_back((float) i); 

    vector<float> B = vector<float>(n); 
    clock_t t1 = clock(); 
    for (int i=0; i<numRuns; i++) 
    for (int j=0; j<n; j++) 
     B[j] = 2*A[j]; 
    clock_t t2 = clock(); 
    printf("Elapsed time is %f seconds\n", double(t2-t1)/CLOCKS_PER_SEC); 

    t1 = clock(); 
    for (int i=0; i<numRuns; i++) 
    B^A; 
    t2 = clock(); 
    printf("Elapsed time is %f seconds\n", double(t2-t1)/CLOCKS_PER_SEC); 

    return 0; 
} 

現在,當後-O3編譯我的計算機上運行時,輸出爲

Elapsed time is 0.370000 seconds 
Elapsed time is 1.170000 seconds 

如果不是我在模板中使用註釋掉的線條,第二次是〜1.8秒。 我的問題是:我如何加快話務員呼叫速度?理想情況下,它應該花費與手動編碼循環相同的時間。

+0

C和C++是不一樣的語言。如果他們是,我們可能會爲他們使用相同的標籤。 –

+0

'printf()'是'uncool'! –

+1

不要編寫一個操作符來執行此操作。寫一個函數。這樣做是運營商超載已經獲得如此糟糕聲譽的原因之一。當你讓操作員做出對每個人都意想不到的事情時(除了你)使得代碼幾乎可以讀取。 –

回答

8

您按值傳遞參數。這使得向量的副本。

template <typename T> 
void operator^(vector<T> A, vector<T> B) 

如果你通過引用傳遞它們,你可能會得到加速。

template <typename T> 
void operator^(vector<T> const& A, vector<T>& B) 

(上ideone.com快速測試顯示even better performance比手寫循環,但我不知道他們啓用編譯什麼優化。)

在另一方面,你可能想以超載一些其他運營商。非賦值和非增量運算符修改它們的參數是不好的風格(我推薦閱讀Operator Overloading FAQ)。相反,您應該重載operator^=

template <typename T> 
vector<T>& operator^=(vector<T>& B, vector<T> const& A){ 
    typename vector<T>::const_iterator a = A.begin(); 
    typename vector<T>::iterator b = B.begin(); 
    while(a!=A.end()){ 
    *b = 2*(*a); 
    a++; b++; 
    } 
    return B; 
} 
+0

啊,但當然。我發誓我比這更好,:)謝謝! – andyInCambridge