簡體   English   中英

C++ 數組與向量排序(在我的情況下,向量比數組慢約 2.5 倍(無優化))

[英]C++ Array vs Vector Sorting (vector ~2.5x slower than array in my case (No Optimization))

我正在對100000元素進行插入排序。 我寫了兩個函數。

1-我將給定的向量復制到數組中,然后應用排序,然后將數組復制回向量以供返回。

2-我在給定的向量上應用排序然后返回它。

現在根據我的知識向量也動態創建了一個數組,C++ Vector []操作符速度的差異應該不存在或至少沒有這么多。 所以方法2應該比方法1快。 但令我驚訝的是,情況正好相反。 我試圖找到一個具體的答案,而不僅僅是數組更快。 :)

編譯器版本 => gcc 版本 6.2.0(Rev2,由 MSYS2 項目構建)g++ main.cpp -o main

#include <time.h>
#include <iostream>
#include <cstdlib>
#include <vector>

using namespace std;

vector<long> InsertionSort1(vector<long> nums){
    int vsize = nums.size();
    long* arr = new long[vsize];
    int swap, j;

    // Coping the vector to an array
    for(int i=0;i<vsize;i++){
        arr[i] = nums[i];
    }

    //sorting
    for(int i=1;i<vsize;i++){
        swap = arr[i];
        j = i-1;
        while(j>=0 && arr[j] > swap){
            arr[j+1] = arr[j];
            j--; 
        }

        arr[j+1] = swap;   

    }

    // Coping the array back to vector
    for(int i=0;i<vsize;i++){
        nums[i] = arr[i];
    }

    return nums;
}

vector<long> InsertionSort2(vector<long> nums){
    int vsize = nums.size();
    int swap, j;

    for(int i=1;i<vsize;i++){
        swap = nums[i];
        j = i-1;
        while(j>=0 && nums[j] > swap){
            nums[j+1] = nums[j];
            j--; 
        }

        nums[j+1] = swap;   

    }

    return nums;
}

int main(){

    vector<long> entries;
    for(int i=0;i<100000;i++){
        entries.push_back(rand()%100000);
    }

    double start = time(0);
    InsertionSort1(entries);
    double end = time(0);

    cout<<"With Array => "<<end-start<<endl;

    start = time(0);
    InsertionSort2(entries);
    end = time(0);

    cout<<"With Vector => "<<end-start<<endl;
}

上面代碼的結果是:

With Array 100000 => 8
With Vector 100000 => 19

我認為衡量性能是一件好事! std::chrono::high_resolution_clockgoogle benchmark是更適合這項工作的工具。

您需要啟用適當的優化級別,例如-O3以獲得有意義的結果。

為什么喜歡實現排序算法。 我將您的方法與std::sort 出於學術目的,這很好,否則你需要有充分的理由和經過衡量的證據,證明你做得更好。

數組 => 2.55608

向量 => 1.74857

使用 std::sort => 0.00657156

#include <time.h>
#include <iostream>
#include <cstdlib>
#include <vector>

using namespace std;

vector<long> InsertionSort1(vector<long> nums){
    int vsize = nums.size();
    long* arr = new long[vsize];
    int swap, j;

    // Coping the vector to an array
    for(int i=0;i<vsize;i++){
        arr[i] = nums[i];
    }

    //sorting
    for(int i=1;i<vsize;i++){
        swap = arr[i];
        j = i-1;
        while(j>=0 && arr[j] > swap){
            arr[j+1] = arr[j];
            j--; 
        }

        arr[j+1] = swap;   

    }

    // Coping the array back to vector
    for(int i=0;i<vsize;i++){
        nums[i] = arr[i];
    }
    // delete of is missing arr;
    return nums;
}

vector<long> InsertionSort2(vector<long> nums){
    int vsize = nums.size();
    int swap, j;

    for(int i=1;i<vsize;i++){
        swap = nums[i];
        j = i-1;
        while(j>=0 && nums[j] > swap){
            nums[j+1] = nums[j];
            j--; 
        }

        nums[j+1] = swap;   

    }

    return nums;
}

int main(){

    vector<long> entries;
    for(int i=0;i<100000;i++){
        entries.push_back(rand()%100000);
    }

    double start = time(0);
    InsertionSort1(entries);
    double end = time(0);

    cout<<"With Array => "<<end-start<<endl;

    start = time(0);
    InsertionSort2(entries);
    end = time(0);

    cout<<"With Vector => "<<end-start<<endl;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM