# [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)
```