2014-09-05 40 views
-1

我貼在ideone以下錐http://ideone.com/Hp9pL8下:數組memcpy比矢量stl :: copy on ideone快1000倍以上?

#include <iostream> 
#include <chrono> 
#include <vector> 
#include <algorithm> 
#include <cstring> 

using namespace std; 

int main() { 
    constexpr size_t elems = 500000; 
    { 
    int array_source[elems]; 
    int array_destination[elems]; 
    iota(begin(array_source),end(array_source),0); 
    auto start = chrono::high_resolution_clock::now(); 
    memcpy (array_destination, array_source, elems * sizeof(int)); 
    auto stop = chrono::high_resolution_clock::now(); 
    auto duration = stop - start; 
    auto nanoseconds = chrono::duration_cast<chrono::nanoseconds>(duration); 
    cout << "Duration of old style copy: " << nanoseconds.count() << " ns." << endl; 
    } 
    { 
    vector<int> vector_source(elems); 
    vector<int> vector_destination(elems); 
    iota(begin(vector_source),end(vector_source),0); 
    auto start = chrono::high_resolution_clock::now(); 
    copy(begin(vector_source), end(vector_source), begin(vector_destination)); 
    auto stop = chrono::high_resolution_clock::now(); 
    auto duration = stop - start; 
    auto nanoseconds = chrono::duration_cast<chrono::nanoseconds>(duration); 
    cout << "Duration of stl style copy: " << nanoseconds.count() << " ns." << endl; 
    } 
} 

輸出是:

Duration of old style copy: 280 ns. 
Duration of stl style copy: 931438 ns. 

我預計這兩種方法產生近於優化的建立相同的指令。爲什麼複製矢量慢1000倍以上。 ideone沒有使用任何優化?

+4

如果您想對'std :: copy'測量'memcpy',請在兩種情況下使用相同的數據類型。對於'memcpy'使用自動存儲陣列,對'std :: copy'使用'std :: vector',原因不明。 – juanchopanza 2014-09-05 07:20:26

+2

在這兩種情況下,複製都可以被優化,因爲它不產生輸出 – 2014-09-05 07:22:03

+0

當代碼字符串包含'ns.'時,爲什麼輸出以'ms.'結尾還不清楚' – 2014-09-05 07:23:38

回答

4

這是一個優化問題。您應該使用destination_array中的內容。我修補你的代碼

memcpy (array_destination, array_source, elems * sizeof(int)); 
unsigned ix = getpid() % elems; 
cout << "ix#" << ix << " @" << array_destination [ix] << endl; 
auto stop = chrono::high_resolution_clock::now(); 
auto duration = stop - start; 
auto nanoseconds = chrono::duration_cast<chrono::nanoseconds>(duration); 

當然我還添加了相應的#include ...

,並得到更合理的時機(這的確也是衡量IO時間):

ix#4640 @4640 
Duration of old style copy: 1925353 ns. 
Duration of stl style copy: 910400 ns. 

編譯器正確地優化您的代碼。 array_destination沒有真正使用。

當然,您可以將輸出移出時間。我這樣做,我自己的機器上(我不是很熟悉ideone),並得到了:

Duration of old style copy: 675192 ns. 
Duration of stl style copy: 228392 ns. 
ix#1877 x=1877 

順便說一句,一個可以夢想一個非常聰明的優化,這甚至不會構建既不array_source也不array_destination和會優化輸出線

cout << "ix#" << ix << " @" << ix << endl; 

由於一個可以證明,對於所有指數i我們array_destination[i] == i但是編譯器還沒有爲足夠聰明。

+4

這是無用的,因爲你現在正在計時I/O。 – Xeo 2014-09-05 07:35:57

+1

I/O時間並不重要.... – 2014-09-05 07:38:50

+0

我修改了原來的程序,使用堆分配數組而不是基於堆棧的數組(第一次),同樣的情況發生(優化不會發生)。 – ysdx 2014-09-05 07:45:33