«前の日記(2006.08.18 / Friday) 最新 次の日記(2006.08.20 / Sunday)» 編集

Hena Hena Nikki

2003|05|06|07|08|09|10|11|12|
2004|01|02|03|04|05|06|07|08|09|10|11|12|
2005|01|02|03|04|05|06|07|08|09|10|11|12|
2006|01|02|03|04|05|06|07|08|09|10|11|12|
2007|01|02|03|04|05|06|07|08|09|10|11|12|
2008|01|02|03|04|05|06|07|08|09|10|11|12|
2009|01|02|03|04|05|06|07|08|09|10|11|12|
2010|01|02|03|04|05|06|07|08|09|10|11|12|
2011|01|02|03|04|05|06|07|08|10|11|12|
2012|01|02|03|04|05|06|07|08|10|12|
2013|01|02|04|06|

2006.08.19 / Saturday [長年日記]

* [computer] Yasm 0.5.0 を Mac OS X 10.4 にインストールする

事前に libiconv, gettext を入れておいた方が良い。 CFLAGS はお好みで。

$ wget -c http://www.tortall.net/projects/yasm/releases/yasm-0.5.0.tar.gz
$ zcat yasm-0.5.0.tar.gz | tar xvf -
$ cd yasm-0.5.0/
$ ./configure
$ make && make check
$ sudo make install

* [computer] wxWidgets 2.7.0 を Mac OS X 10.4 にインストールする

事前に関係ライブラリ群 (SDL, libpng, libjpeg, libtiff, Expat, libiconv, libzlib など) を出来るだけ多く入れておきたいところ。 もちろん CFLAGS はお好みで。

$ wget -c http://jaist.dl.sourceforge.net/sourceforge/wxwindows/wxWidgets-2.7.0-1.tar.bz2
$ bzcat wxWidgets-2.7.0-1.tar.bz2 | tar xvf -
$ mkdir wxWidgets-2.7.0-1/carbon_build
$ cd wxWidgets-2.7.0-1/carbon_build
$ ../configure --enable-monolithic --with-sdl --enable-stl --enable-unicode --with-opengl
$ make && make samples
$ sudo make install

* [computer] GCC の最適化

ずっと SH でソフトウェア開発している方に、 「for ループはインクリメントよりデクリメントの方が速いよ」と言われ、 実験してみた。

#include <iostream>
static const int loop(100000000);
size_t LoopFunctionI(void) { size_t ret_val(0); for (int i(0); i < loop; ++i) { ++ret_val; } return ret_val; }
size_t LoopFunctionD(void) { size_t ret_val(0); for (int i(loop); 0 < i; --i) { ++ret_val; } return ret_val; }
int main(void) { std::cout << LoopFunctionI() << ':' << LoopFunctionD() << std::endl;
return 0; }

で、これを Mac OS X (on x86), GCC 4.0.1 で g++ -O2 main.cpp -S して、main.s を開くと…。

.globl __Z13LoopFunctionIv
__Z13LoopFunctionIv:
LFB1447:
        pushl   %ebp
LCFI0:
        movl    %esp, %ebp
LCFI1:
        xorl    %eax, %eax
L2:
        addl    $1, %eax
        cmpl    $100000000, %eax
        jne     L2
        popl    %ebp
        ret
LFE1447:
        .align 1,0x90
.globl __Z13LoopFunctionDv
__Z13LoopFunctionDv:
LFB1448:
        pushl   %ebp
LCFI2:
        movl    %esp, %ebp
LCFI3:
        xorl    %eax, %eax
L9:
        addl    $1, %eax
        cmpl    $100000000, %eax
        jne     L9
        popl    %ebp
        ret
LFE1448:
        .align 1,0x90

ふむ…? 最適化って凄い・怖いですねぇ…。 って言うか、そこまでやるならいきなり 100000000 返して欲しい…。 (← shinh さんとこの GCC 4.1 on Linux だとこうなったそうだ)

loopiunsigned int にしたら、 ちゃんとインクリメントとデクリメントが保持された。 けっこう神経質なんだ、GCC って。

もっとちゃんと考えた例じゃないと意味がなさそう (LoopFunctionI(), LoopFunctionD() がダメすぎ等) なので、またそのうち実験してみるか…。


  • この日記には本日 名の方が訪問してくださっているようです。 また、昨日は 名の方が訪問してくださったようです。
  • この日記の更新情報の取得には antenna.lirs を利用するのがおすすめです。