分配和释放内存 VS。先分配,每次只处理
Allocate and free memory VS. allocate first, process only for each time
我正在尝试编写机器人硬件的串行通信部分。我有一个台式电脑主板,该程序没有内存限制 (8GB RAM, i3 cpu etc.)
,该程序通过 USB(Fullspeed)
或串口以 115200
波特率与微控制器通信。
我对我的问题很小感到困惑。我有 20 到 30 种方法,他们正在使用这种通信功能。
哪个处理速度快更有效?此函数只有一个实例同时运行。
先定义,每次使用;
...
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;
}
或者每次分配和释放;
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 秒 x 分钟):
周期的结果
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
我正在尝试编写机器人硬件的串行通信部分。我有一个台式电脑主板,该程序没有内存限制 (8GB RAM, i3 cpu etc.)
,该程序通过 USB(Fullspeed)
或串口以 115200
波特率与微控制器通信。
我对我的问题很小感到困惑。我有 20 到 30 种方法,他们正在使用这种通信功能。
哪个处理速度快更有效?此函数只有一个实例同时运行。
先定义,每次使用;
... 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; }
或者每次分配和释放;
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 秒 x 分钟):
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