我正在寫數值代碼,其中定義矢量操作很有用。例如,如果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秒。 我的問題是:我如何加快話務員呼叫速度?理想情況下,它應該花費與手動編碼循環相同的時間。
C和C++是不一樣的語言。如果他們是,我們可能會爲他們使用相同的標籤。 –
'printf()'是'uncool'! –
不要編寫一個操作符來執行此操作。寫一個函數。這樣做是運營商超載已經獲得如此糟糕聲譽的原因之一。當你讓操作員做出對每個人都意想不到的事情時(除了你)使得代碼幾乎可以讀取。 –