# 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 來做到平行化,先從結果來看優化版本與一般版本差了多少效能 ![](https://i.imgur.com/C9xL3pY.png) 在 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; } ```