C++拷贝测试

104 阅读2分钟

涉及到雷达等传感器,测试数据拷贝的速度,assign速度更快

#include <vector>  
#include <sys/time.h>  
  
struct timespec start;  
struct timespec end;  
  
#include "fmt/format.h"  
  
  
unsigned long nano_second(timespec &s, timespec &e) {  
unsigned long begin_tag = s.tv_sec * 1000000000 + s.tv_nsec;  
unsigned long end_tag = e.tv_sec * 1000000000 + e.tv_nsec;  
return end_tag - begin_tag;  
}  
  
#define B_LEN 50000  
#define LOOP_NUM 10  
  
int main() {  
    int a[2][11]{0};  
    for (int i = 0; i < sizeof(a[0]) / sizeof(int); ++i) {  
        a[1][i] = i;  
    }  

    int b[B_LEN] = {1, 2, 3};  

    memcpy(&a[1][5], b + 1, 2 * sizeof(int));  

    for (auto const &item: a[1]) {  
        fmt::print("{}\n", item);  
    }  

    long double assign_avg_time, memcpy_avg_time, for_avg_time;  

    for (int j = 0; j < LOOP_NUM; ++j) {  
        std::vector<int> c(B_LEN);  

        clock_gettime(CLOCK_REALTIME, &start);  
        c.assign(&b[0], &b[B_LEN]);  
        clock_gettime(CLOCK_REALTIME, &end);  

        auto tmp = nano_second(start, end);  
        assign_avg_time += tmp;  
        fmt::print("assign time: {} {} ns\n", j, tmp); // 98293  

        std::vector<int> d;  
        d.reserve(B_LEN); // 两行代码等效于:std::vector<int> c(B_LEN);  

        clock_gettime(CLOCK_REALTIME, &start);  
        memcpy(&d[0], b, B_LEN * sizeof(int));  
        clock_gettime(CLOCK_REALTIME, &end);  

        tmp = nano_second(start, end);  
        memcpy_avg_time += tmp;  
        fmt::print("memcpy time: {} {} ns\n", j, tmp); // 8024  

        std::vector<int> e{B_LEN};  
        clock_gettime(CLOCK_REALTIME, &start);  
        for (int &i: b) {  
        e.emplace_back(i);  
        }  
        clock_gettime(CLOCK_REALTIME, &end);  

        tmp = nano_second(start, end);  
        for_avg_time += tmp;  
        fmt::print("for time: {} {} ns\n\n", j, tmp); // 1915929  
    }  

    assign_avg_time /= LOOP_NUM;  
    memcpy_avg_time /= LOOP_NUM;  
    for_avg_time /= LOOP_NUM;  

    fmt::print("assign_avg_time: {} ns\n", assign_avg_time);  
    fmt::print("memcpy_avg_time: {} ns\n", memcpy_avg_time);  
    fmt::print("for_avg_time: {} ns\n", for_avg_time);  
}
/data/workspace/workspace-clion/lidar/cmake-build-debug/tests/copy_data
0
1
2
3
4
2
3
7
8
9
10
assign time: 0 9356 ns
memcpy time: 0 97893 ns
for time:    0 2031911 ns

assign time: 1 7900 ns
memcpy time: 1 93468 ns
for time:    1 2029773 ns

assign time: 2 7781 ns
memcpy time: 2 92690 ns
for time:    2 2045980 ns

assign time: 3 8018 ns
memcpy time: 3 95904 ns
for time:    3 2151308 ns

assign time: 4 8082 ns
memcpy time: 4 125195 ns
for time:    4 2163068 ns

assign time: 5 9174 ns
memcpy time: 5 96702 ns
for time:    5 2108752 ns

assign time: 6 10269 ns
memcpy time: 6 97703 ns
for time:    6 2189939 ns

assign time: 7 12198 ns
memcpy time: 7 107263 ns
for time:    7 2211773 ns

assign time: 8 11036 ns
memcpy time: 8 101798 ns
for time:    8 2169116 ns

assign time: 9 10225 ns
memcpy time: 9 100704 ns
for time:    9 2181267 ns

assign_avg_time: 9403.9 ns
memcpy_avg_time: 100932 ns
for_avg_time:    2128288.7 ns

进程已结束,退出代码0