SHELL排序測試

來源:互聯網
上載者:User

一、比較表:

第一章第一節中所提及的排序程式測試結果如下:
┌──────┬─────────┬────────┐
│ 項 目│ C │組 合 語 言 │
├──────┼─────────┼────────┤
│源程式長度 │ 1,363 Bytes│ 3,581 Bytes│
│執行程式長度│ 69,345 Bytes│ 803 Bytes│
│編程時間 │ 20 小時 │ 80 小時 │
│8,000 筆需時│ 30 秒 │ 8 秒 │
│48,000筆需時│ 640KB中, 無法執行│ 70 秒 │
└──────┴─────────┴────────┘

組合語言在大量資料處理時,應用靈活,而C語言因受到空間限制,以目前之系統空間,無法執行。
測試時間: 1989年 9月12至18日。
參加人員: 張達權,段旭光,李朝輝。
使用機種: IBM PS/2-50,80286 CPU,8MHZ。
使用語言: C及組合語言。
因其他語言皆無法勝任,故僅選用此二者。
處理對象: 48,000個中文片語,分別取自12個資料檔中。
每檔有 4,000個片語。
每個片語有一至五個中文字。
每個中文字佔兩個字元內碼。
全部資料占 316,421字元。
排序方式: 按倉頡字母順位排列。
為了效率,採用SHELL 排序法。

二、組合語言之製作:

1: CG SEGMENT
2: ASSUME CS:CG,DS:CG,ES:CG
3: ORG 100H
4: START:
5: MOV AX,CS
6: MOV DS,AX
7: MOV SI,130 ; 指向輸入緩衝區
8: MOV BL,[SI-2]
9: DEC BX
10: SUB BH,BH
11: MOV [BX][SI],BH
12: CLD
13: MOV DX,SI
14: MOV AX,3D00H
15: INT 21H ; 開啟源檔
16: JNC ZSTART
17: MOV DX,OFFSET ZSTR1 ; 若無此檔則退出
18: MOV AH,9
19: INT 21H
20: INT 20H
21: ZSTART:
22: MOV BX,AX
23: SUB DX,DX
24: MOV CX,8000H
25: MOV BP,4D00H
26: MOV DS,BP
27: ZREAD:
28: MOV AH,3FH ; 讀檔
29: INT 21H
30: OR AX,AX
31: JZ ZREND
32: MOV AX,DS ; 未完,換段再讀
33: ADD AX,800H
34: MOV DS,AX
35: JMP ZREAD
36: ZREND:
37: MOV AH,3EH ; 關檔
38: INT 21H
39: MOV AX,2400H
40: MOV ES,AX
41: SUB DI,DI
42: SUB SI,SI
43: MOV DS,BP
44: SUB BP,BP
45: ZC1:
46: CALL ZCHGSEG
47: MOV CX,5 ; 將不等長換為等長
48: ZC3:
49: LODSW
50: CMP AL,0DH
51: JZ ZC4
52: STOSW
53: LOOP ZC3
54: INC SI
55: INC SI
56: JMP SHORT ZC5
57: ZC4:
58: MOV AX,2020H
59: REP STOSW
60: ZC5:
61: INC BP
62: LODSB
63: DEC SI
64: CMP AL,1AH
65: JNZ ZC1
66: STOSB
67: MOV CS:ZBW2,BP ; BP為資料計數
68: CALL ZSORT ; 排序
69: CALL ZDEL ; 刪除相同者
70: CALL ZTR ; 換為不等長方式
71: MOV SI,DX
72: SUB CX,CX
73: PUSH CS
74: POP DS
75: MOV DX,OFFSET ZFCB ; 將結果存檔
76: MOV AH,3CH
77: INT 21H
78: MOV BX,AX
79: MOV AX,2400H
80: MOV DS,AX
81: SUB DX,DX
82: OR SI,SI
83: JZ ZC7
84: MOV CX,8000H
85: ZC6:
86: MOV AH,40H
87: INT 21H
88: MOV AX,DS
89: ADD AX,800H
90: MOV DS,AX
91: DEC SI
92: JNZ ZC6
93: ZC7:
94: MOV CX,DI
95: MOV AH,40H
96: INT 21H
97: MOV AH,3EH
98: INT 21H
99: INT 20H
100: ZSORT: ; 排序子程式
101: SHR BP,1
102: ZS0:
103: PUSH BP
104: MOV CS:ZBW1,BP
105: MOV AX,CS:ZBW2
106: SUB AX,BP
107: MOV DX,BP
108: MOV BP,AX
109: MOV DI,2400H
110: MOV DS,DI
111: SUB SI,SI
112: CALL ZFINDES
113: ADD BX,DI
114: MOV ES,BX
115: MOV DI,AX
116: SUB DX,DX
117: ZS1:
118: CALL ZCOMPS
119: JBE ZS4
120: CALL ZXCHG
121: PUSH DS
122: PUSH ES
123: PUSH SI
124: PUSH DI
125: PUSH DX
126: ZS2:
127: MOV DI,SI
128: MOV AX,DS
129: MOV ES,AX
130: SUB DX,CS:ZBW1
131: JC ZS3
132: CALL ZFINDES
133: MOV SI,AX
134: ADD BX,2400H
135: MOV DS,BX
136: CALL ZCOMPS
137: JBE ZS3
138: CALL ZXCHG
139: JMP ZS2
140: ZS3:
141: POP DX
142: POP DI
143: POP SI
144: POP ES
145: POP DS
146: ZS4:
147: ADD SI,10
148: JS ZS7
149: ZS5:
150: ADD DI,10
151: JS ZS8
152: ZS6:
153: INC DX
154: CMP DX,BP
155: JNZ ZS1
156: POP BP
157: SHR BP,1
158: JNZ ZS0
159: RET
160: ZS7:
161: SUB SI,8000H
162: MOV AX,DS
163: ADD AX,800H
164: MOV DS,AX
165: JMP ZS5
166: ZS8:
167: SUB DI,8000H
168: MOV AX,ES
169: ADD AX,800H
170: MOV ES,AX
171: JMP ZS6
172: ZFINDES:
173: SUB BX,BX
174: MOV AX,DX
175: SHL AX,1
176: RCL BX,1
177: SHL AX,1
178: RCL BX,1
179: ADD AX,DX
180: ADC BX,0
181: SHL AX,1
182: RCL BX,1
183: PUSH AX
184: MOV CL,4
185: SHR AX,CL
186: MOV CL,12
187: SHL BX,CL
188: ADD BX,AX
189: POP AX
190: AND AX,15
191: RET
192: ZXCHG:
193: MOV CL,5
194: ZXCHG1:
195: LODSW
196: MOV BX,ES:[DI]
197: STOSW
198: MOV [SI-2],BX
199: LOOP ZXCHG1
200: SUB SI,10
201: SUB DI,10
202: RET
203: ZCOMPS:
204: MOV CL,5
205: MOV AX,DI
206: MOV BX,SI
207: REPZ CMPSB
208: MOV SI,BX
209: MOV DI,AX
210: RET
211: ZTR: ; 將等長串換為不等長串
212: MOV AX,2400H
213: MOV DS,AX
214: MOV ES,AX
215: SUB SI,SI
216: MOV DI,SI
217: MOV BP,CS:ZBW2
218: MOV DX,SI
219: ZTR1:
220: MOV CL,5
221: LODSW
222: CMP AX,2020H
223: JNZ ZTR21
224: ADD SI,8
225: DEC BP
226: JMP ZTR1
227: ZTR2:
228: LODSW
229: CMP AX,2020H
230: JZ ZTR3
231: ZTR21:
232: STOSW
233: ZTR3:
234: LOOP ZTR2
235: MOV AX,0A0DH
236: STOSW
237: DEC BP
238: JZ ZTR4
239: CALL ZCHGSEG
240: JMP ZTR1
241: ZTR4:
242: MOV AL,1AH
243: STOSB
244: RET
245: ZCHGSEG: ; 換段子程式
246: OR SI,SI
247: JNS ZCH1
248: SUB SI,BX
249: MOV AX,DS
250: ADD AX,800H
251: MOV DS,AX
252: ZCH1:
253: OR DI,DI
254: JNS ZCH2
255: SUB DI,BX
256: MOV AX,ES
257: ADD AX,800H
258: MOV ES,AX
259: INC DX
260: ZCH2:
261: RET
262: ZDEL: ; 刪除相同字串
263: MOV AX,2400H
264: MOV DS,AX
265: MOV ES,AX
266: SUB SI,SI
267: MOV DI,10
268: MOV BP,CS:ZBW2
269: MOV BX,8000H
270: ZDEL1:
271: DEC BP
272: JZ ZCH2
273: MOV AX,SI
274: PUSH DI
275: MOV CL,10
276: REPZ CMPSB
277: POP DI
278: MOV SI,AX
279: JNZ ZDEL2
280: MOV AX,2020H
281: MOV [SI],AX
282: ZDEL2:
283: ADD SI,10
284: ADD DI,10
285: CALL ZCHGSEG
286: JMP ZDEL1
287: ZBW1 DW 0
288: ZBW2 DW 0
289: ZFCB DB 'YRRR',0
290: ZSTR1 DB 'FILE NOT FOUND !$'
291: CG ENDS
292: END START

本段程式,計用了80小時,源程式為 3,581字元,執行程式則為 803 字元。執行48,000片語排序,需時70秒。
及後,因為C語言所寫的程式,無法處理48,000個片語,一直試到8,000 條,C才能勝任。再用組合語言程式測試,僅需時8秒。

三、C 語言之製作過程:

我們用相同的方法,利用C寫作如下程式:
1: # include <fcntl.h>
2: # include <sys\stat.h>
3:
4: extern unsigned char yr[];
5:
6: main(argc, argv)
7: int argc;
8: char *argv[];
9: {
10: int i, n, fd, result;
11: long rsum;
12: unsigned char *yrp[8000], *yrptr, eof[1];
13:
14: fd = open(argv[1], O_RDWR);
15: rsum = 0;
16: while ((result = read(fd, &yr[rsum], 16384)) > 0)
17: {
18: rsum += result;
19: printf("%d %ld\n", result, rsum);
20: }
21: close(fd);
22: printf("after reading file\n");
23: fd = creat(argv[1], S_IREAD | S_IWRITE);
24: printf("after creat file\n");
25: yrp[0] = yrptr = yr;
26: n = 1;
27: while (*yrptr && n < 8000)
28: {
29: while (*yrptr++ != '\n');
30: yrp[n++] = yrptr;
31: }
32: sort(yrp, n);
33: for (i = 0; i < n; i++)
34: {
35: yrptr = yrp[i];
36: do
37: {
38: write(fd, yrptr, 1);
39: } while (*yrptr++ != '\n');
40: }
41: eof[0] = 0x1a;
42: write(fd, eof, 1);
43: close(fd);
44: }
45:
46:
47: sort(v, n)
48: unsigned char *v[];
49: int n;
50: {
51: int gap, i, j;
52: unsigned char *temp;
53:
54: printf("enter sorting\n");
55: for (gap = n / 2; gap > 0; gap /= 2)
56: for (i = gap; i < n; i++)
57: for (j = i - gap; j >= 0; j -= gap)
58: {
59: if (strcmp(v[j], v[j + gap]) <= 0)
60: break;
61: /* printf("swapping\n");*/
62: temp = v[j];
63: v[j] = v[j + gap];
64: v[j + gap] = temp;
65: }
66: }
67:
68: strcmp(v1, v2)
69: unsigned char *v1, *v2;
70: {
71: /* printf("enter strcmp\n");*/
72: for (; *v1 == *v2; v1++, v2++)
73: if (*v1 == '\n')
74: return(0);
75: return(*v1 - *v2);
76: }

本段程式由設計到製作完成,僅用了20小時。但在測試時,花了不少時間,費盡心機,始終無法令本程式運行,原因是資料太大系統空間不夠。
最後不得已將資料刪至8,000 條,才運行成功,需時30秒。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.