jserv
, homework
yusihlin
Architecture: i686
CPU 作業模式: 32-bit, 64-bit
Byte Order: Little Endian
CPU(s): 4
On-line CPU(s) list: 0-3
每核心執行緒數:2
每通訊端核心數:2
Socket(s): 1
供應商識別號: GenuineIntel
CPU 家族: 6
型號: 37
Model name: Intel(R) Core(TM) i5 CPU 650 @ 3.20GHz
製程: 5
CPU MHz: 1200.000
CPU max MHz: 3201.0000
CPU min MHz: 1200.0000
BogoMIPS: 6383.71
虛擬: VT-x
L1d 快取: 32K
L1i 快取: 32K
L2 快取: 256K
L3 快取: 4096K
請先列出開發環境
課程助教已補上謝謝williamchangTW
make
時,在終端機出現以下問題:
test_cpy.c: In function 'main':
test_cpy.c:124:17:error: 'for' loop initial declaration are only allowed in C99 mode
for (int i = 0; i < sidx; i++)
test_cpy.c:124:17: note: use option -std=c99 or -std=gnu99 to compile your code
make: *** [test_cpy.o] Error 1
test_cpy.c
& test_ref.c
:
gcc -std=c99 test_cpy.c
gedit test_cpy.c file
& add line below
int i;
for (i = 0; i < stdx; i++)
int i
在做for loop
//tst.c file
typedef struct tst_node {
char key;
unsigned refcnt;
struct tst_node *lokid;
struct tst_node *eqkid;
struct tst_node *hikid;
} tst_node;
lower child < search value
=> *lokidequal child = search value
=> *erqkidhigher child > search value
=> *hikidAverage-case running time | Worst-case running time | |
---|---|---|
Lookup | O(logn) | O(n) |
Insertion | O(logn) | O(n) |
Delete | O(logn) | O(n) |
改用 HackMD 的語法重制上圖
"jserv"已修正,謝謝
"williamchangTW"
最後做總結,參考了link:
enum { INS, DEL, WRDMAX = 256, STKMAX = 512, LMAX = 1024 };
#define REF INS
#define CPY DEL
enum 是列舉,用來宣告元素定義整數,根據規範若沒有賦予其值,就是 0->1->2…以此類推,所以目前 INS = 0 = REF , DEL = 1 = CPY
#define REF DEL
,明顯出現錯誤choice : s
suggest[1001] : Ta
suggest[1002] : Ta
suggest[1003] : Ta
suggest[1004] : Ta
suggest[1005] : Ta
suggest[1006] : Ta
suggest[1007] : Ta
suggest[1008] : Ta
suggest[1009] : Ta
suggest[1010] : Ta
suggest[1011] : Ta
suggest[1012] : Ta
suggest[1013] : Ta
suggest[1014] : Ta
suggest[1015] : Ta
suggest[1016] : Ta
suggest[1017] : Ta
suggest[1018] : Ta
suggest[1019] : Ta
suggest[1020] : Ta
suggest[1021] : Ta
suggest[1022] : Ta
suggest[1023] : Ta
只有輸出
fscanf,%S,word
所取得的長度,很明顯的沒有傳入整串字串給其輸出
suggest[947] : Taylorsville,
suggest[948] : Taylorville,
suggest[949] : Tayoltita,
suggest[950] : Taypano,
suggest[951] : Tayport,
suggest[952] : Taysan,
suggest[953] : Tayshet,
suggest[954] : Taytay,
suggest[955] : Taytayan,
suggest[956] : Taytsy,
suggest[957] : Tayturka,
suggest[958] : Tayu,
suggest[959] : Tayud,
suggest[960] : Tayug,
suggest[961] : Tayum,
suggest[962] : Tayuman,
suggest[963] : Taywanak
suggest[964] : Tayzhina,
suggest[965] : Taza,
suggest[966] : Tazacorte,
suggest[967] : Tazewell,
suggest[968] : Tazlău,
suggest[969] : Tazoult-Lambese,
suggest[970] : Tazovskiy,
choice : s
的時候發生錯誤
for (int i = 0; i < sidx; i++)
printf("suggest[%d] : %s\n", i, sgl[i]);
可見它是輸出 sgl[i] 內的內容,而 i 是它找到的數字內有的,它是關聯性記憶體配置,所以在附近的都是關聯性教高的
在上述中有提到 CPY 的值可能為 1 or 0,若我要跑 CPY 程式則設 1 ,反之則 0,這邊的 CPY 是由 test_ref.c 所提供,所以我把程式裡的 CPY changed to REF
if (*p++ == 0) {
if (cpy) { /* allocate storage for 's' */
const char *eqdata = strdup(*s);
if (!eqdata)
return NULL;
curr->eqkid = (tst_node *) eqdata;
return (void *) eqdata;
} else { /* save pointer to 's' (allocated elsewhere) */
curr->eqkid = (tst_node *) *s;
return (void *) *s;
}
}
上述程式中,若為 CPY = 1 則會給它一塊記憶體空間存取值,若不為 1 則會走另外一個判斷式,因此錯誤在這個地方
FIXME
標注的地方(共3處)
t1 = tvgetf();
while ((rtn - fscanf(fp, "%s", word)) != EOF) {
char *p - word;
/*FIXME: insert reference to each string*/
if (!tst_ins_del(&root, &p, INS, CPY)) {
fprintf(stderr, "error: memory exhausted, tst_insert.\n");
fclose(fp);
return 1;
}
idx++;
}
int cpy
維持不變void *tst_ins_del(tst_node **root, char *const *s, const int del, const int cpy);
/*tst.h*/
unsigned tst_get_refcnt(const tst_node *node);
/*tst.c*/
unsigned tst_get_refcnt(const tst_node *node)
{
return node->refcnt;
}
perf stat ./test_ref
225.444266 task-clock (msec) # 0.024 CPUs utilized
25 context-switches # 0.111 K/sec
2 cpu-migrations # 0.009 K/sec
6,615 page-faults # 0.029 M/sec
773,503,788 cycles # 3.431 GHz (82.26%)
67,672,385 stalled-cycles-frontend # 8.75% frontend cycles idle (83.88%)
304,831,532 stalled-cycles-backend # 39.41% backend cycles idle (34.86%)
549,998,612 instructions # 0.71 insns per cycle
# 0.55 stalled cycles per insn (50.80%)
108,195,625 branches # 479.922 M/sec (66.50%)
3,064,576 branch-misses # 2.83% of all branches (82.95%)
9.289633678 seconds time elapsed
perf stat ./test_cpy
226.348106 task-clock (msec) # 0.034 CPUs utilized
22 context-switches # 0.097 K/sec
2 cpu-migrations # 0.009 K/sec
6,614 page-faults # 0.029 M/sec
745,684,917 cycles # 3.294 GHz (82.32%)
64,710,984 stalled-cycles-frontend # 8.68% frontend cycles idle (82.35%)
301,841,280 stalled-cycles-backend # 40.48% backend cycles idle (35.89%)
540,944,385 instructions # 0.73 insns per cycle
# 0.56 stalled cycles per insn (53.77%)
109,386,057 branches # 483.265 M/sec (68.70%)
2,994,135 branch-misses # 2.74% of all branches (84.59%)
6.668136718 seconds time elapsed
文字訊息請避免用圖片表示
"jserv"好的老師,已經全數換成字來顯示資訊
"williamchangTW"
Taipei , Tiawan
有一件事可以作為區隔城市與國家,當中用","
區隔開來,想法是可以利用此分割點作為讀區到此點及返回找城市,或從此點開始對後面做搜尋找國家- Forward Declaration 根據其中提到的觀點,可以了解到為什麼要使用這個技巧,因為可以避免不必要的重新定義,當專案大到一定的程度時,會嚴重拖延編譯的時間,影響效能
"Aliasing problem"
簡易而論,也就是資訊不對稱,有可能同時存取同樣記憶體位置,當其中一方改變,而另一方拿取錯誤的資訊,造成不如預期的錯誤稱之列出論文時,應該明確提及標題 (+超連結) Glib-C: C as an alternative Object OrientedEnvironment。論文閱讀和內文摘要是大學生很重要的訓練,可試著先把重點列出 (就像你已經做的事) 並透過實例解說和討論
"jserv"已更正此部份所發生的不明確問題,並於其他地方發生過類似問題的地方做修正
"williamchangTW"