set、vector與list的構(gòu)造與排序的耗時(shí)測(cè)試

測(cè)試目標(biāo)

創(chuàng)新互聯(lián)為企業(yè)級(jí)客戶提高一站式互聯(lián)網(wǎng)+設(shè)計(jì)服務(wù),主要包括成都網(wǎng)站建設(shè)、網(wǎng)站設(shè)計(jì)、重慶APP軟件開(kāi)發(fā)、微信小程序開(kāi)發(fā)、宣傳片制作、LOGO設(shè)計(jì)等,幫助客戶快速提升營(yíng)銷能力和企業(yè)形象,創(chuàng)新互聯(lián)各部門(mén)都有經(jīng)驗(yàn)豐富的經(jīng)驗(yàn),可以確保每一個(gè)作品的質(zhì)量和創(chuàng)作周期,同時(shí)每年都有很多新員工加入,為我們帶來(lái)大量新的創(chuàng)意。 

測(cè)試在成員個(gè)數(shù)不斷遞增的情況下,set、vector與list的構(gòu)造與排序的耗時(shí)變化,找出set耗時(shí)連續(xù)超過(guò)其他容器耗時(shí)的成員個(gè)數(shù)


測(cè)試方式

  • set使用直接插入

  • vector使用assign構(gòu)造并使用全局sort排序

  • list使用assign構(gòu)造與成員sort的排序之間

  • 比較的是耗時(shí)時(shí)間大小,對(duì)耗時(shí)的具體值不關(guān)心,因?yàn)椴煌臋C(jī)器配置不一樣

測(cè)試結(jié)論

由于設(shè)定的連續(xù)超過(guò)次數(shù)不同,得到的成員個(gè)數(shù)值也不同,并且隨著連續(xù)超過(guò)上限的增加而增加,因此現(xiàn)在得到的成員個(gè)數(shù)值并不準(zhǔn)確,如:

在連續(xù)超過(guò)上限為10時(shí),成員個(gè)數(shù)最大在700左右

在連續(xù)超過(guò)上限為20時(shí),成員個(gè)數(shù)最大在2000左右

但有一點(diǎn)可以肯定:set的邊插入邊排序效率,沒(méi)有vector與list的賦值或排序高,如果有海量數(shù)據(jù)排序的情況,用vector或list的賦值后排序的性能相對(duì)于set比較好。


測(cè)試代碼

// 主邏輯 main.cpp
#include "TimeConsume.h"
#include "Random.h"
#include <unistd.h>
#include <vector>
#include <list>
#include <set>
#include <algorithm>
#include <iostream>
#include <cstdint>
#include <string>
using namespace std;

// set耗時(shí)是否連續(xù)超出其他容器
bool is_continue_beyond(uint64_t vector_time, uint64_t list_time, uint64_t set_time, uint64_t beyond_num) {
    static uint64_t s_beyond_num = beyond_num; 
    if (set_time > list_time && set_time > vector_time) {
	--s_beyond_num;
    } else {
	s_beyond_num = beyond_num;
    }

    return s_beyond_num == 0;
}

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

    uint64_t member_count_num = 0;
    uint64_t member_add_num = 0;
    uint64_t beyond_num = 0;
    if (argc != 4) {
	cout << "input: " << argv[0] << " member_start_num member_add_num beyond_num" << endl;
	return -1;
    } else {
	member_count_num = strtoull(argv[1], NULL, 10);
	member_add_num = strtoull(argv[2], NULL, 10);
	beyond_num = strtoull(argv[3], NULL, 10);
    }

    uint64_t vector_time = 0;
    uint64_t list_time   = 0;
    uint64_t set_time    = 0;

    while (!is_continue_beyond(vector_time, list_time, set_time, beyond_num)) {
	vector<uint64_t > input_random_num; // 使用一樣的隨機(jī)數(shù)據(jù)
	Random random;
	random.SetRandomNum<vector<uint64_t> >(member_count_num, input_random_num);

	// 構(gòu)造排序函數(shù)
	vector<uint64_t> monitor_vector; // 外部定義容器,防止構(gòu)造析構(gòu)帶來(lái)的時(shí)間計(jì)算
	auto vector_sort = [&]() {
	    monitor_vector.assign(input_random_num.begin(), input_random_num.end());
	    sort(monitor_vector.begin(), monitor_vector.end());
	};

	list<uint64_t> monitor_list;
	auto list_sort = [&]() {
	    monitor_list.assign(input_random_num.begin(), input_random_num.end());
	    monitor_list.sort();
	};

	set<uint64_t> monitor_set;
	auto set_sort = [&](){
	    monitor_set.insert(input_random_num.begin(), input_random_num.end());
	};

	// 統(tǒng)計(jì)排序時(shí)間
        TimeConsume vector_time_consume(vector_sort);
        TimeConsume list_time_consume(list_sort);
        TimeConsume set_time_consume(set_sort);

	vector_time = vector_time_consume.GetFnTime();
	list_time = list_time_consume.GetFnTime();
	set_time = set_time_consume.GetFnTime();

	cout << "count:" << member_count_num<< "\t" << "vector_time:" << vector_time << "\t" << "list_time:" << list_time << "\t" << "set_time:" << set_time << endl;
	sleep(0.5);
	member_count_num += member_add_num;
    }
    return 0;
}
/*
TimeConsume.h
用于獲得程序運(yùn)行的時(shí)間消耗,支持函數(shù)對(duì)象(C++11新標(biāo)準(zhǔn))
獲得的耗時(shí)為微秒級(jí)
*/
#ifndef TIME_CONSUME_H
#define TIME_CONSUME_H

#include <sys/time.h>
#include <ctime>
#include <functional>
using std::function;

#define SEC_RATIO_MSEC 1000
#define SEC_RATIO_USEC (1000*SEC_RATIO_MSEC)

class TimeConsume {
public:
    TimeConsume(const function<void()> &monitor_fn = [](){;})
	: m_monitor_fn(monitor_fn) {
	    Clear();
    }

    ~TimeConsume()
    {;}

    // 設(shè)置耗時(shí)監(jiān)控的函數(shù)對(duì)象
    inline function<void()> SetMonitorFn(const function<void()> &monitor_fn()) {
    	auto old_monitor_fn = m_monitor_fn;
    	m_monitor_fn = monitor_fn;
    	return old_monitor_fn;
    }

    // 記錄開(kāi)始監(jiān)控的時(shí)間點(diǎn)
    inline void Start() {
	    gettimeofday(&m_start, NULL);
    }
    
    // 記錄結(jié)束監(jiān)控的時(shí)間點(diǎn)
    inline void End() {
	    gettimeofday(&m_end, NULL);
    }

    // 依據(jù)開(kāi)始和結(jié)束監(jiān)控的時(shí)間點(diǎn),得到微秒級(jí)耗時(shí)
    inline uint64_t GetIntervalTime() {
    	if ((m_end.tv_sec > m_start.tv_sec)
    	    || (m_end.tv_sec == m_start.tv_sec && m_end.tv_usec >= m_start.tv_usec)) {
    	    return (m_end.tv_sec - m_start.tv_sec)*SEC_RATIO_USEC + (m_end.tv_usec - m_start.tv_usec); 
    	} else {
    	    return 0;
    	}
    }

    // 獲得監(jiān)控函數(shù)對(duì)象的微秒級(jí)運(yùn)行耗時(shí)
    inline uint64_t GetFnTime() {
        Clear();
    	Start();
    	m_monitor_fn();
    	End();
    	return GetIntervalTime();
    }

protected:
    // 格式化內(nèi)部相關(guān)值
    inline void Clear() {
    	m_start.tv_sec = 0;
    	m_start.tv_usec = 0;
    	m_end.tv_sec = 0;
    	m_end.tv_usec = 0;
    }

private:
    struct timeval m_start;
    struct timeval m_end;
    function<void()> m_monitor_fn;
};
#endif
/*
Random.h
可以向STL 容器里填充指定個(gè)數(shù)的隨機(jī)值,取值范圍在[0-RAND_MAX],RAND_MAX為最大值的整數(shù)常量表達(dá)式。此值依賴實(shí)現(xiàn)。保證此值至少為32767
*/
#ifndef RANDOM_H
#define RANDOM_H

#include <ctime>
#include <iterator>
using std::inserter;

class Random {
public:
    Random() {
	srand(time(NULL));
    }

    ~Random()
    {;}

    template <typename  ContainerT>
    inline void SetRandomNum(uint64_t count, ContainerT &container) {
	auto iter = inserter(container, container.end());
	for (uint64_t i = 0; i < count; ++i) {
	    iter = rand();
	}
    }
};

如果對(duì)測(cè)試有什么疑問(wèn)或建議,歡迎大家來(lái)討論

文章標(biāo)題:set、vector與list的構(gòu)造與排序的耗時(shí)測(cè)試
網(wǎng)站鏈接:http://bm7419.com/article24/giggje.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供微信小程序、App開(kāi)發(fā)、外貿(mào)建站、網(wǎng)站設(shè)計(jì)公司、搜索引擎優(yōu)化

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

成都網(wǎng)站建設(shè)