(toppers-users 2276) 雑談:割り算と条件分岐

酔漢 suikan7 @ yahoo.co.jp
2006年 1月 31日 (火) 20:57:51 JST


こんにちは。

JSP 1.4.2 カーネルのソースを眺めていて面白いコードを見つけたので、皆さん
の息抜きになればと思い投稿しました。忙しい方は飛ばしてください。すみません。

当のコードはkernel/time_event.cのisg_tim()です。このルーチンはタイマー割
込みを受けて内部のティックを更新します。その更新部分は次のようになってい
ます。

    /*
    * next_time,next_subtime を更新する.
    */
    #if TIC_DENO == 1
    next_time = current_time + TIC_NUME;
    #else /* TIC_DENO == 1 */
    next_subtime += TIC_NUME;
    next_time = current_time + next_subtime / TIC_DENO;
    next_subtime %= TIC_DENO;
    #endif /* TIC_DENO == 1 */

TIC_DENO != 1の場合、分数加算をするためにnext_timeとnext_subtimeを累積し
ています、そのときの両者の計算に割り算と剰余算使われています。コンパイラ
によっては一度の割り算で商と余を得ると思いますが、それでも一般には割り算
のコストは大きいです。

けちですみません。しかし、移植を考えていたシステムは、ティックに使いたい
タイマーが32768の1/n周期で割り込みを発生するので考えがよろめいていたのです。

もし次のリリースがありましたら、


/*
* next_time,next_subtime を更新する.
*/
#if TIC_DENO == 1
next_time = current_time + TIC_NUME;
#else /* TIC_DENO == 1 */
next_subtime += ( TIC_NUME % TIC_DENO );
next_time = current_time + ( TIC_NUME / TIC_DENO )
if ( next_subtime >= TIC_DENO )
{
next_subtime -= TIC_DENO
next_time ++;
}
#endif /* TIC_DENO == 1 */

といったコードもご検討ください。コンパイラがきちんとしていれば、割り算を
使わないコードを生成してくれます。

-- 
酔漢
Blackfin 空挺団           http://adsp2191.hp.infoseek.co.jp/
TOPPERS/JSP for Blackfin  http://sourceforge.jp/projects/toppersjsp4bf/
Blog                      http://blackfin.g.hatena.ne.jp/suikan/

--------------------------------------
GANBARE! NIPPON!
Yahoo! JAPAN JOC OFFICIAL INTERNET PORTAL SITE PARTNER
http://pr.mail.yahoo.co.jp/ganbare-nippon/