cpp test write content speed to ssd and usual disk respectively 1M,10M,100M rows data,the fact has illustrated the write speed of ssd is 4-5 times faster than usual disk

发布时间 2023-06-05 23:53:27作者: Fred1987
#include <chrono>
#include <ctime>
#include <fstream>
#include <iomanip>
#include <iostream>
#include <sstream>
#include <thread>
#include <uuid/uuid.h>

std::string get_time_now()
{
    auto now = std::chrono::high_resolution_clock::now();
    time_t raw_time = std::chrono::high_resolution_clock::to_time_t(now);
    struct tm tm_info = *localtime(&raw_time);
    std::chrono::seconds seconds = std::chrono::duration_cast<std::chrono::seconds>(now.time_since_epoch());
    auto mills = std::chrono::duration_cast<std::chrono::milliseconds>(now.time_since_epoch());
    auto micros = std::chrono::duration_cast<std::chrono::microseconds>(now.time_since_epoch());
    auto nanos = std::chrono::duration_cast<std::chrono::nanoseconds>(now.time_since_epoch());
    std::stringstream ss;
    ss << std::put_time(&tm_info, "%Y%m%d%H%M%S") << "_"
       << std::setw(3) << std::setfill('0') << (mills.count() - seconds.count() * 1000)
       << std::setw(3) << std::setfill('0') << (micros.count() - mills.count() * 1000)
       << std::setw(3) << std::setfill('0') << (nanos.count() - micros.count() * 1000);
    return ss.str();
}
 
char *uuid_value = (char *)malloc(40);
char *get_uuid_value()
{
    uuid_t new_uuid;
    uuid_generate(new_uuid);
    uuid_unparse(new_uuid, uuid_value);
    return uuid_value;
}

void log_file(const std::string &file_name, const int &loops)
{
    std::fstream w_file(file_name, std::ios::app);
    if (!w_file.is_open())
    {
        std::cout << get_time_now() << ",create or open " << file_name << " failed!" << std::endl;
        return;
    }

    std::uint64_t num = 0;
    std::stringstream ss;

    for (int j = 0; j < loops; j++)
    {
        for (int i = 0; i < 1000000; i++)
        {
            ss << ++num << "," << get_uuid_value() << std::endl;
        }
        w_file << ss.str();
        ss = std::stringstream();
        std::cout << get_time_now() << "," << num << ",loop:" << j + 1 << std::endl;
    }

    w_file.close();
    std::cout << get_time_now() << ",finish in " << __FUNCTION__ << std::endl;
}
 
std::stringstream read_file_to_ss(const std::string &file_name)
{
    std::stringstream ss;
    std::fstream r_file(file_name, std::ios::in);
    if (!r_file.is_open())
    {
        std::cout << get_time_now() << " open " << file_name << " failed!" << std::endl;
        return ss;
    }

    std::string line;
    while (getline(r_file, line))
    {
        ss << line;
    }
    r_file.close();
    return ss;
}

void test_populate_ssd(const std::string &src_name, const int &len, const std::string &dest_file)
{
    // std::string file_name1="log1.txt",file_name10="log10.txt",file_name_100="log100.txt";
    // /media/fred/WD_BLACK/log1.txt
    std::stringstream ss = read_file_to_ss(src_name);
    std::fstream w_file(dest_file, std::ios::app);
    std::chrono::time_point<std::chrono::high_resolution_clock> _start_time, _end_time;
    for (int i = 0; i < 10; i++)
    {
        _start_time = std::chrono::high_resolution_clock::now();
        w_file << ss.str();
        _end_time = std::chrono::high_resolution_clock::now();
        std::cout << get_time_now()<<",src file:"<<src_name << ",rows:" << len << ",loop: " << i + 1 << ",length:" << ss.str().length()<<std::endl;
        std::cout << ",Time cost:"
                  << std::chrono::duration_cast<std::chrono::seconds>(_end_time - _start_time).count() << " seconds,"
                  << std::chrono::duration_cast<std::chrono::milliseconds>(_end_time - _start_time).count() << " mills,"
                  << std::chrono::duration_cast<std::chrono::microseconds>(_end_time - _start_time).count() << " micros,"
                  << std::chrono::duration_cast<std::chrono::nanoseconds>(_end_time - _start_time).count() << " nanos!" << std::endl;
    }
    std::cout << get_time_now() << ",finish len:" << len << std::this_thread::get_id() << std::endl;
}

void test_populate_ssd_1_10_100()
{
    std::cout << "1000000" << std::endl;
    test_populate_ssd("log1.txt", 1000000, "/media/fred/WD_BLACK/log1.txt");
    std::cout << std::endl
              << std::endl;
    std::cout << "10000000" << std::endl;
    test_populate_ssd("log10.txt", 10000000, "/media/fred/WD_BLACK/log10.txt");
    std::cout << std::endl
              << std::endl;
    std::cout << "100000000" << std::endl;
    test_populate_ssd("log100.txt", 1000000, "/media/fred/WD_BLACK/log100.txt");
    std::cout << std::endl
              << std::endl;
              std::cout << get_time_now() << ",finish in:" << __FUNCTION__<<","<< std::this_thread::get_id() << std::endl;
}

int main(int args, char **argv)
{ 
    // log_file(argv[1], atoi(argv[2]));
    test_populate_ssd_1_10_100();
    std::cout << get_time_now() << ",finish in " << __FUNCTION__ << std::endl;
}

Compile

g++-12 -std=c++2a -I. *.cpp -o h1 -luuid

Run

nohup ./h1 >>write.log | tail -f write.log

 

 

 

 

The execute script as below

 

#include <chrono>
#include <ctime>
#include <fstream>
#include <iomanip>
#include <iostream>
#include <sstream>
#include <thread>
#include <uuid/uuid.h>

std::string get_time_now()
{
    auto now = std::chrono::high_resolution_clock::now();
    time_t raw_time = std::chrono::high_resolution_clock::to_time_t(now);
    struct tm tm_info = *localtime(&raw_time);
    std::chrono::seconds seconds = std::chrono::duration_cast<std::chrono::seconds>(now.time_since_epoch());
    auto mills = std::chrono::duration_cast<std::chrono::milliseconds>(now.time_since_epoch());
    auto micros = std::chrono::duration_cast<std::chrono::microseconds>(now.time_since_epoch());
    auto nanos = std::chrono::duration_cast<std::chrono::nanoseconds>(now.time_since_epoch());
    std::stringstream ss;
    ss << std::put_time(&tm_info, "%Y%m%d%H%M%S") << "_"
       << std::setw(3) << std::setfill('0') << (mills.count() - seconds.count() * 1000)
       << std::setw(3) << std::setfill('0') << (micros.count() - mills.count() * 1000)
       << std::setw(3) << std::setfill('0') << (nanos.count() - micros.count() * 1000);
    return ss.str();
}
 
char *uuid_value = (char *)malloc(40);
char *get_uuid_value()
{
    uuid_t new_uuid;
    uuid_generate(new_uuid);
    uuid_unparse(new_uuid, uuid_value);
    return uuid_value;
}

void log_file(const std::string &file_name, const int &loops)
{
    std::fstream w_file(file_name, std::ios::app);
    if (!w_file.is_open())
    {
        std::cout << get_time_now() << ",create or open " << file_name << " failed!" << std::endl;
        return;
    }

    std::uint64_t num = 0;
    std::stringstream ss;

    for (int j = 0; j < loops; j++)
    {
        for (int i = 0; i < 1000000; i++)
        {
            ss << ++num << "," << get_uuid_value() << std::endl;
        }
        w_file << ss.str();
        ss = std::stringstream();
        std::cout << get_time_now() << "," << num << ",loop:" << j + 1 << std::endl;
    }

    w_file.close();
    std::cout << get_time_now() << ",finish in " << __FUNCTION__ << std::endl;
}
 
std::stringstream read_file_to_ss(const std::string &file_name)
{
    std::stringstream ss;
    std::fstream r_file(file_name, std::ios::in);
    if (!r_file.is_open())
    {
        std::cout << get_time_now() << " open " << file_name << " failed!" << std::endl;
        return ss;
    }

    std::string line;
    while (getline(r_file, line))
    {
        ss << line;
    }
    r_file.close();
    return ss;
}

void test_populate_ssd(const std::string &src_name, const int &len, const std::string &dest_file)
{
    // std::string file_name1="log1.txt",file_name10="log10.txt",file_name_100="log100.txt";
    // /media/fred/WD_BLACK/log1.txt
    std::stringstream ss = read_file_to_ss(src_name);
    std::fstream w_file(dest_file, std::ios::app);
    std::chrono::time_point<std::chrono::high_resolution_clock> _start_time, _end_time;
    for (int i = 0; i < 10; i++)
    {
        _start_time = std::chrono::high_resolution_clock::now();
        w_file << ss.str();
        _end_time = std::chrono::high_resolution_clock::now();
        std::cout << get_time_now()<<",src file:"<<src_name << ",rows:" << len << ",loop: " << i + 1 << ",length:" << ss.str().length()<<std::endl;
        std::cout << ",Time cost:"
                  << std::chrono::duration_cast<std::chrono::seconds>(_end_time - _start_time).count() << " seconds,"
                  << std::chrono::duration_cast<std::chrono::milliseconds>(_end_time - _start_time).count() << " mills,"
                  << std::chrono::duration_cast<std::chrono::microseconds>(_end_time - _start_time).count() << " micros,"
                  << std::chrono::duration_cast<std::chrono::nanoseconds>(_end_time - _start_time).count() << " nanos!" << std::endl;
    }
    std::cout << get_time_now() << ",finish len:" << len << std::this_thread::get_id() << std::endl;
}

void test_populate_ssd_1_10_100()
{
    std::cout << "1000000" << std::endl;
    test_populate_ssd("log1.txt", 1000000, "/media/fred/WD_BLACK/log1.txt");
    std::cout << std::endl
              << std::endl;
    std::cout << "10000000" << std::endl;
    test_populate_ssd("log10.txt", 10000000, "/media/fred/WD_BLACK/log10.txt");
    std::cout << std::endl
              << std::endl;
    std::cout << "100000000" << std::endl;
    test_populate_ssd("log100.txt", 1000000, "/media/fred/WD_BLACK/log100.txt");
    std::cout << std::endl
              << std::endl;
              std::cout << get_time_now() << ",finish in:" << __FUNCTION__<<","<< std::this_thread::get_id() << std::endl;
}

void test_populate_disk_1_10_100()
{
    std::cout << "1000000" << std::endl;
    test_populate_ssd("log1.txt", 1000000, "/media/fred/Elements/log1.txt");
    std::cout << std::endl
              << std::endl;
    std::cout << "10000000" << std::endl;
    test_populate_ssd("log10.txt", 10000000, "/media/fred/Elements/log10.txt");
    std::cout << std::endl
              << std::endl;
    std::cout << "100000000" << std::endl;
    test_populate_ssd("log100.txt", 1000000, "/media/fred/Elements/log100.txt");
    std::cout << std::endl
              << std::endl;
              std::cout << get_time_now() << ",finish in:" << __FUNCTION__<<","<< std::this_thread::get_id() << std::endl;
}

int main(int args, char **argv)
{ 
    ///media/fred/Elements
    // log_file(argv[1], atoi(argv[2]));
    // test_populate_ssd_1_10_100();
    test_populate_disk_1_10_100();
    std::cout << get_time_now() << ",finish in " << __FUNCTION__ << std::endl;
}