- 日時: 2005/03/30 17:50
- 名前: せきの <sekino@mtb.biglobe.ne.jp>
- DmDatabaseInfo を使うことってよくありますよね
やたらと引数が多いけれど知りたいのは一つか二つなんていうことありません?
DmDatabaseInfoのプロトタイプは
Err DmDatabaseInfo(UInt16 cardNo, LocalID dbID, Char *nameP, UInt16 *attributesP, UInt16 *versionP, UInt32 *crDateP, UInt32 *modDateP, UInt32 *bckUpDateP, UInt32 *modNumP, LocalID *appInfoIDP, LocalID *sortInfoIDP, UInt32 *typeP, UInt32 *creatorP)
さて、cardNoとdbIDからtypeとcreatorの二つの情報を知るために何バイト使うのか調べてみましょう
こんな関数があるとします static void sample1(LocalID dbID, UInt32 *typeP, UInt32 *creatorP) { DmDatabaseInfo(0, dbID, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, typeP, creatorP); }
アセンブリコードを生成してもらって見ると...
Hunk: Kind=HUNK_LOCAL_CODE Name="sample1__FUlPUlPUl"(1) Size=62 00000000: 4E56 0000 link a6,#0 00000004: 2F2E 0010 move.l 16(a6),-(a7) 00000008: 2F2E 000C move.l 12(a6),-(a7) 0000000C: 4878 0000 pea 0x00000000 00000010: 4878 0000 pea 0x00000000 00000014: 4878 0000 pea 0x00000000 00000018: 4878 0000 pea 0x00000000 0000001C: 4878 0000 pea 0x00000000 00000020: 4878 0000 pea 0x00000000 00000024: 4878 0000 pea 0x00000000 00000028: 4878 0000 pea 0x00000000 0000002C: 4878 0000 pea 0x00000000 00000030: 2F2E 0008 move.l 8(a6),-(a7) 00000034: 4267 clr.w -(a7) 00000036: 4E4F trap #15 00000038: A046 sysTrapDmDatabaseInfo 0000003A: 4E5E unlk a6 0000003C: 4E75 rts
ふむふむ 一行目の末尾を見てください この関数は62バイト使っているようですね
んー、ごくノーマルな記述ですが... なんだか5行目から同じコードが繰り返されていて無駄に見えます
サイズ削減にトライしてみましょう
こんなコードはどうでしょうか
static void sample2(LocalID dbID, UInt32 *typeP, UInt32 *creatorP) { UInt32* mp = (UInt32*)MemLocalIDToLockedPtr(dbID, 0);
*typeP = mp[15]; *creatorP = mp[16];
MemPtrUnlock(mp); }
この関数は、さっきの関数と同じ結果を戻せます
さて、どうなるでしょう?
またアセンブリコードを生成してもらって見ると...
Hunk: Kind=HUNK_LOCAL_CODE Name="sample2__FUlPUlPUl"(5) Size=50 00000000: 4E56 0000 link a6,#0 00000004: 2F0A move.l a2,-(a7) 00000006: 4267 clr.w -(a7) 00000008: 2F2E 0008 move.l 8(a6),-(a7) 0000000C: 4E4F trap #15 0000000E: A036 sysTrapMemLocalIDToLockedPtr 00000010: 2448 movea.l a0,a2 00000012: 206E 000C movea.l 12(a6),a0 00000016: 20AA 003C move.l 60(a2),(a0) 0000001A: 206E 0010 movea.l 16(a6),a0 0000001E: 20AA 0040 move.l 64(a2),(a0) 00000022: 2F0A move.l a2,-(a7) 00000024: 4E4F trap #15 00000026: A035 sysTrapMemPtrUnlock 00000028: 4FEF 000A lea 10(a7),a7 0000002C: 245F movea.l (a7)+,a2 0000002E: 4E5E unlk a6 00000030: 4E75 rts
おっ 50バイトに減りました
12バイトの節約です
たかが12バイトとあなどるなかれ 表現を変えると「20%のサイズ減」でございます
データベースのヘッダがどんな構造になっているか知っていると 「こんなコードサイズの節約もできますよ」 というお話でした
|