# [AIdrifter CS 浮生筆錄](https://hackmd.io/s/rypeUnYSb) : System Profile ## ftime() - 暴力簡單的美學,但是要考慮uart2輸出的限制,或是把stdout redirect到file。 ```C static struct timeb m_startTime,m_endTime; void time_start_ms(void) { ftime(&m_startTime); } int show_diff_time_ms(void) { ftime(&m_endTime); return (1000*(m_endTime.time - m_startTime.time)) + (m_endTime.millitm - m_startTime.millitm); } ``` ## perf - embedded system 上面可能會有諸多限制。 ## Coding Style - 更快 ```C for(int i=0;i<5;i++) for(int j=0;j<5;j++) array[i][j] = 0; memset(array, 0, sizeof(array)); ``` - 不做多餘的memory operation ```C memset(tmp,0,sizeof(tmp)); // We Should remove this snprintf(tmp,MAX_BUF,"Model:%s",pStr); ``` - 注意memory hierarchy - CPU cache > DRAM > FALSH(SQL database) > External Devices - 用`snprintf()` 把指令一次寫入 減少多餘的IO ## How to improve busy loop? ### busy loop ```C while(1) { // do something usleep(1000) } ``` ### wait and signal ```C event = new:(std:nothrow)event<uint8_t>; uint8_t dummy=0; while(event->wait(&dummy) == 0) { event->wait(&dummy,timeoutMS); // do something } event->send(0); ``` ### busy polling ```C while(1) { // do something usleep(1000); } ``` ### busy polling slow ```C while(1) { // do something usleep(100*1000); } ``` 假設知道100ms可以完成 不要直接busy polling 可以先撐個90ms在開始 ```C // [ADD] sleep 90ms to save busy polling cost while(...) { // polling hw register if(done) break; // sleep 2ms or less } ``` ## profile CPU Bound ### busybox top - 顯示每個core loading ```shell busybox top put 1 ``` ![](/uploads/upload_cbdca5871da9a185c0ce0784c5b1d643.png) ### busybox chrt - 調整process priority ```shell busybox chrt -r -p 99 `pidof firefox` Policy options: -b, --batch set policy to SCHED_BATCH -d, --deadline set policy to SCHED_DEADLINE -f, --fifo set policy to SCHED_FIFO -i, --idle set policy to SCHED_IDLE -o, --other set policy to SCHED_OTHER -r, --rr set policy to SCHED_RR (default) ```