我標杆我GaussQuadrature
模板類的一部分,通過調用成員函數Quadrature
1M次循環和定時整個循環(如果你知道一個更好的辦法,請讓我知道!)。在此類的預期應用程序中,構造函數將被調用一次,並且該例程將被多次調用,但我試圖在循環內調用構造函數1M次,並在外部調用構造函數以查看哪個更快。創建對象的內/外循環:分配和速度
如果我把循環內的構造,該構造函數被調用每一次迭代,但它看起來像它的分配到相同的內存空間(注意,下面的代碼片段,還有就是聲明
std::cout << "ctor\n";
在構造函數中) 。這是巧合還是更深層次?這裏的片段:for(int i = 0; i < 1000000; ++i) { GaussQuadrature<double> Q(N, func, a, b); // some arguments Q.Quadrature(); std::cout << "address: " << &Q << "\n"; }
這給:在
time: 12.47999954
ctor address: 0x7fff23059400 ctor address: 0x7fff23059400 . . . ctor address: 0x7fff23059400
時機這一點沒有在循環或構造的打印語句,即
clock_t tic = clock();
for(int i = 0; i < 1000000; ++i) {
GaussQuadrature<double> Q(N, func, a, b);
Q.Quadrature();
}
float elapsed = (clock() - (float)tic)/CLOCKS_PER_SEC;
std::cout << std::setprecision(10) << "time: " << elapsed << "\n";
結果現在3210
,如果我不是叫外循環的構造,那麼當然它僅調用一次,但它實際上需要更長的時間:
clock_t tic = clock(); GaussQuadrature<double> Q(N, func, a, b); for(int i = 0; i < 1000000; ++i) { Q.Quadrature(); } float elapsed = (clock() - (float)tic)/CLOCKS_PER_SEC; std::cout << std::setprecision(10) << "time: " << elapsed << "\n";
這給
time: 12.65999985
我跑了幾次,結果與時間相似。有什麼想法嗎?謝謝!
他得到相同的指針,因爲它被分配在堆棧上。每次通過循環時,它都被分配和釋放,並且每次都在堆棧上釋放相同的插槽。 –
是的,我同意你的意見,我不想讓他更困惑:) –
@SemihOzmen我其實沒有打印報表,請看我更新的帖子。任何想法爲什麼它被稱爲1M次而不是一次? – bcf