# 2017q1 Homework4 (phonebook-concurrent)
contributed by < `king1224` >
###### tags: `king1224`
## 開發環境
```
OS: 16.04.1 Ubuntu
Architecture: x86_64
CPU 作業模式: 32-bit, 64-bit
Byte Order: Little Endian
CPU(s): 4
On-line CPU(s) list: 0-3
每核心執行緒數: 2
每通訊端核心數: 2
Socket(s): 1
NUMA 節點: 1
供應商識別號: GenuineIntel
CPU 家族: 6
型號: 60
Model name: Intel(R) Core(TM) i5-4200H CPU @ 2.80GHz
製程: 3
CPU MHz: 2913.305
CPU max MHz: 3400.0000
CPU min MHz: 800.0000
BogoMIPS: 5587.41
虛擬: VT-x
L1d 快取: 32K
L1i 快取: 32K
L2 快取: 256K
L3 快取: 3072K
NUMA node0 CPU(s): 0-3
```
## 原始版本
從 github 上 fork 過來後可以看到,原始版本已經有採用 POSIX Thread 來做到平行化,先從結果來看優化版本與一般版本差了多少效能

在 append 函式的差異上,original 與 optimized 真是不能相比,這就是平行處理的誘人之處,反觀 findName 這個函式差異不大,但優化版本還是略贏一點的原因是,優化版本有將搜尋時使用不到的一些資料細節,以另外一個 struct 儲存起來,以縮小搜尋時的 entry size
接下來我們看 optimized 版本到底是怎麼做的吧~
首先先理解中間使用了哪些 function
* text_align
看函式命名我覺得這是一個對齊的函式,從程式碼中可以看到,不論 input file 的一行資料長度有多長,都是固定以 padToLen 長度輸出到 output file,不足的地方以 '\0' 補齊,而得到每行一樣長的檔案
```clike=
int text_align(const char *originFileName,
const char *alignedFileName,
const int padToLen)
{
printf("orginal file size = %ld\n", fsize(originFileName));
FILE *fd_origin = fopen(originFileName, "r");
if (!fd_origin) return -1;
FILE *fd_align = fopen(alignedFileName, "w+");
if (!fd_align) {
fclose(fd_origin);
return -1;
}
char rbuf[MAX_BUFF_SIZE];
int suffix;
char *wbuf = (char *) malloc(sizeof(char) * padToLen);
/* Read each line from input file and pad to "padToLen" characters. */
while (fgets(rbuf, sizeof(rbuf), fd_origin)) {
memset(wbuf, '\0', padToLen);
suffix = padToLen - strlen(rbuf);
/*
* The length of input text is longer than the length to padding to.
* Warn the user, and still write to the output file but with only
* first "PadToLen" bytes.
*/
if (suffix < 0)
printf("Warning:"
" The length of %s is longer than %d.\n", rbuf, padToLen);
strncpy(wbuf, rbuf, strlen(rbuf));
fwrite(wbuf, padToLen, 1, fd_align);
}
fclose(fd_align);
fclose(fd_origin);
free(wbuf);
printf("Aligned file size = %ld\n", fsize(alignedFileName));
return 0;
}
```
輸入跟輸出檔案大小比較:
可以看到為了讓每行對齊,檔案變得很大呢
```
orginal file size = 3206080
Aligned file size = 5598400
```
* createThread_ar
```clike=
thread_arg *createThread_arg(char *data_begin, char *data_end,
int threadID, int numOfThread,
entry *entryPool)
{
thread_arg *new_arg = (thread_arg *) malloc(sizeof(thread_arg));
new_arg->data_begin = data_begin;
new_arg->data_end = data_end;
new_arg->threadID = threadID;
new_arg->numOfThread = numOfThread;
new_arg->lEntryPool_begin = entryPool;
new_arg->lEntry_head = new_arg->lEntry_tail = entryPool;
return new_arg;
}
```