分配和释放内存VS.先分配,每次只处理



我正在尝试编写机器人硬件的串行通信部分。我有一个桌面pc主板,没有内存限制(8GB RAM, i3 cpu etc.),该程序通过USB (Fullspeed)115200波特率串行与微控制器通信。我对我的小问题感到困惑。我有20到30种方法他们正在使用这个通信功能。

哪一种处理速度更快?此函数在同一时间只能运行一个实例。

  1. 首先定义,使用everytime;

    ...
    private:
        struct timespec ctv1, ctv2;
        double time_diff;
        int serial_write_ret;
        int ret_val;
    ...
    int MSerial::genAndSend_setInt32Command() 
    {
        genSum ( stm_buf_t );
        sem_wait ( &serial_mutex );
        // someFunctions();
        sem_post ( &serial_mutex );
        return ret_val;
    }
    
  2. 或者每次分配和释放;

    int MSerial::genAndSend_setInt32Command()
    {
        genSum ( stm_buf_t );
        struct timespec ctv1, ctv2;
        double time_diff = .0;
        int serial_write_ret;
        int ret_val = TIMEOUT_ERROR_IN_SERIAL;
        sem_wait ( &serial_mutex );
        // someFunction();
        sem_post ( &serial_mutex );
        return ret_val;
    }
    

这种差异真的很重要吗?

我的懒惰…

这是80 * 60 * 5 周期(Hz x Seconds x Minutes):

的结果。
Process only:: mean: 0.00356445 in seconds
Alloc Dealloc:: mean: 0.0743379 in seconds
以下是代码和冗余输出:

分配-每次分配

class AllocEvery
{
public:
    int doSomething()
    {
        double pi, gold, ogh;
        std::string den_rit, jobs, bill;
        char c_str[64];
        pi   = 3.1415926535;
        gold = 1.6180339887;
        ogh  = 0.0000000033;
        ogh += pi;
        ogh += gold;
        jobs = "Being the richest man in the cemetery doesn't matter to me. Going to bed at night saying we've done something wonderful, that's what matters to me.";
        bill = "Your most unhappy customers are your greatest source of learning.";
        den_rit = "UNIX is basically a simple operating system, but you have to be a genius to understand the simplicity.";
    }
};

过程只有:

class ProcessOnly
{
public:
    double pi, gold, ogh;
    std::string den_rit, jobs, bill;
    char c_str[64];
    int doSomething()
    {
        pi   = 3.1415926535;
        gold = 1.6180339887;
        ogh  = 0.0000000033;
        ogh += pi;
        ogh += gold;
        jobs = "Being the richest man in the cemetery doesn't matter to me. Going to bed at night saying we've done something wonderful, that's what matters to me.";
        bill = "Your most unhappy customers are your greatest source of learning.";
        den_rit = "UNIX is basically a simple operating system, but you have to be a genius to understand the simplicity.";
    }
};

和主

int main ( int argc, char **argv )
{
    int max = 80 * 60 * 5; // Rate * Seconds * Minutes
    struct timespec time1, time2;
    double time_diff = .0;
    AllocEvery obj; /// ProcessOnly obj;
    clock_gettime ( CLOCK_MONOTONIC, &time1 );
    for (int i = 0; i < max; i++)
    {
        obj.doSomething();
    }
    clock_gettime ( CLOCK_MONOTONIC, &time2 );
    time_diff = time2.tv_sec - time1.tv_sec + ( time2.tv_nsec - time1.tv_nsec ) / BILLION;
    std::cout << "Process only:: Elapsed time: " << time_diff << std::endl;
return 0;
}

和不同运行的输出:

ogh@ubuntu:~/C_Cpp_Examples/tryspeed_cpp$ ./a.out
------------> Alloc - Dealloc Everytime:: Elapsed time: 0.075384
ogh@ubuntu:~/C_Cpp_Examples/tryspeed_cpp$ ./a.out
------------> Alloc - Dealloc Everytime:: Elapsed time: 0.0741677
ogh@ubuntu:~/C_Cpp_Examples/tryspeed_cpp$ ./a.out
------------> Alloc - Dealloc Everytime:: Elapsed time: 0.074426
ogh@ubuntu:~/C_Cpp_Examples/tryspeed_cpp$ ./a.out
------------> Alloc - Dealloc Everytime:: Elapsed time: 0.0740817
ogh@ubuntu:~/C_Cpp_Examples/tryspeed_cpp$ ./a.out
------------> Alloc - Dealloc Everytime:: Elapsed time: 0.0734898
ogh@ubuntu:~/C_Cpp_Examples/tryspeed_cpp$ ./a.out
------------> Alloc - Dealloc Everytime:: Elapsed time: 0.0747045
ogh@ubuntu:~/C_Cpp_Examples/tryspeed_cpp$ ./a.out
------------> Alloc - Dealloc Everytime:: Elapsed time: 0.0727975
ogh@ubuntu:~/C_Cpp_Examples/tryspeed_cpp$ ./a.out
------------> Alloc - Dealloc Everytime:: Elapsed time: 0.0772903
ogh@ubuntu:~/C_Cpp_Examples/tryspeed_cpp$ ./a.out
------------> Alloc - Dealloc Everytime:: Elapsed time: 0.0726992
ogh@ubuntu:~/C_Cpp_Examples/tryspeed_cpp$ ./p.out
------------>  Process only:: Elapsed time: 0.00806864
ogh@ubuntu:~/C_Cpp_Examples/tryspeed_cpp$ ./p.out
------------>  Process only:: Elapsed time: 0.00727956
ogh@ubuntu:~/C_Cpp_Examples/tryspeed_cpp$ ./p.out
------------>  Process only:: Elapsed time: 0.00202144
ogh@ubuntu:~/C_Cpp_Examples/tryspeed_cpp$ ./p.out
------------>  Process only:: Elapsed time: 0.00195636
ogh@ubuntu:~/C_Cpp_Examples/tryspeed_cpp$ ./p.out
------------>  Process only:: Elapsed time: 0.00203696
ogh@ubuntu:~/C_Cpp_Examples/tryspeed_cpp$ ./p.out
------------>  Process only:: Elapsed time: 0.00387936
ogh@ubuntu:~/C_Cpp_Examples/tryspeed_cpp$ ./p.out
------------>  Process only:: Elapsed time: 0.00276425
ogh@ubuntu:~/C_Cpp_Examples/tryspeed_cpp$ ./p.out
------------>  Process only:: Elapsed time: 0.00200299
ogh@ubuntu:~/C_Cpp_Examples/tryspeed_cpp$ ./p.out
------------>  Process only:: Elapsed time: 0.00207049

最新更新