トップページ > 過去ログ > 記事閲覧
T-Pilot流 けちけちプログラミングTips
日時: 2005/03/31 07:34
名前: せきの   <sekino@mtb.biglobe.ne.jp>

ニーズがあるかどうか判りませんが
T-Pilot流 けちけちプログラミングのTipsを思いつくままに
Page: [1]

DmDatabaseInfo ( No.1 )
日時: 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%のサイズ減」でございます

データベースのヘッダがどんな構造になっているか知っていると
「こんなコードサイズの節約もできますよ」
というお話でした
問題 ( No.2 )
日時: 2005/04/15 10:57
名前: せきの  <sekino@mtb.biglobe.ne.jp>

ListはFormに配置しなければいけない?

[Yes] or [No]

------------------
普通はFormを用意してListやField、Buttonなどを載せていきますよね

お箸、箸置き、ご飯茶碗、味噌汁のおわん、お漬物...
は食卓にレイアウトしないといけないのでしょうか?

PalmOSではどうなんでしょう?

というお話

答えは次回に...

Page: [1]