スポンサードリンク


Warning: Illegal string offset 'cache_time' in /home/fumi/public_html/wp-content/plugins/tweetable/tweetable.php on line 404

/tmp を /dev/shm へのシンボリックリンクにすると

crontab -e で crontab を編集して保存しても反映されない。

2/24, 2/25, 2/26, 2/27

2/24 ~ 2/25 徹夜で仕事(休日出勤)、2/26 ~ 2/27 徹夜で仕事(休日出勤)、という無茶な週末を送っていました。しかも、2/27 の未明に気持ちわるくなって客先で作業中にもかかわらずトイレでケロケロしていました。ケロケロすると大分楽になりました。それにしても何が原因だろうか……。

就職活動の学生への説明

就職活動の学生の説明や質問の対応に行かなければならないらしい。面倒というよりは嫌だ。
自分の発言で学生達の未来を変える(かもしれない)ことに責任が持てないのでやりたくなかった。だけど、これはちょっと前の自分の気持ち。最近は、学生の質問に正直に答えれば良いと思えてきた。その結果、学生がこの会社を選ぶにしても、選ばないにしても、それはそれでいいのかもしれないと思う。自分以外の人がもし嘘を言ったせいで学生がいっぱい入ってきて『こんなはずじゃなかった』とか言われるより、正直に答えて学生自身に考えて貰うのが一番なのだ。

もし、私が説明していたら暖く見守ってくださいね。>就職活動の学生さん

高速化

gprofを使って一番遅いメソッドを調べ
高速化させた。結果としてはそのメソッドでは 4 倍早くなった。具体的にどんな処理で、何を講じたかを書いておこう。
まずメソッドは、CMLcdPixDefault::updatePixel 。残映の処理を行なう処理なので、ピクセルを全てなめている。それが遅い原因みたいだった。処理の一部は以下のとおり。


for( y = start_y; y < end_y; y++ )
for( x = start_x; x < end_x; x++ )
{
switch(LcdBlRvMgr::getPixelStatus(x / expansion, y / expansion))
{
case ON:
fgPixelData[y - start_y][x - start_x] = ((int)pixelData[y][x] + (int)fgPixelData[y - start_y][x - start_x] * ( ai_value - 1 ) ) / ai_value;
(中略)
}
}

この縦横を舐める二重ループと条件判定、残映のための乗算と除算が重い。
結果からいうと以下のように修正した。


for( y = start_y; y < end_y; y++ )
for( x = start_x; x < end_x; x++ )
{
switch(LcdBlRvMgr::getPixelStatus( convertFromReal( x ), convertFromReal( y )))
{
case ON:
fgPixelData[y - start_y][x - start_x] = aiTransientTable[ fgPixelData[y - start_y][x - start_x] ][ pixelData[y][x]];
(中略)
}
}
  • LcdBlRvMgr::getPixelStatus をインライン関数にした
  • x / expansion (expansion は拡大)を、convertFromReal というインラインメソッドにした。このメソッド中ではテーブルにより、x / expansion を返すようにした。
  • aiTransientTable[ ピクセル現在値 ][ ピクセル最新値 ] という残映のための 256x256 のテーブルを作り、それで次の値を計算させるようにした

つまり「メモリを使って高速化」ということです。

[Unix]vfatのデバイスでの cvs のcheckout

大文字・小文字を区別しないのでうまくいかない。[Zaurus] VFAT vs ext2 – 暮らしの業 (2003-12-19)にあるように、mountのオプションを修正することで解決。

zaurus で gprof を使用したプロファイルができない

できない。実行すると、gmon.out はできるのだがそれを出力すると下記のようになり、意味を無さない。


Each sample counts as 0.01 seconds.
%   cumulative   self              self     total
time   seconds   seconds    calls  ms/call  ms/call  name
100.00      0.01     0.01        2     5.00     5.00  QTERuputer::metaObject(void) const
0.00      0.01     0.00  6560548     0.00     0.00  MemoryBase::isAddressOver(unsigned long)
0.00      0.01     0.00  5655269     0.00     0.00  State::getState(void)
0.00      0.01     0.00  5537982     0.00     0.00  MemoryBase::readMemory8(unsigned long)
0.00      0.01     0.00  4752384     0.00     0.00  LcdBlRvMgr::getPixelStatus(int, int)

回数は正しい値のようであるが時間がおかしい。0.01 しか経過していないわけがない。何が原因なのかなぁ……。
追記:

やったこととか。

  • special kernel が原因だと思い、元に戻して実行したが変わらず(出力結果は異なるがおかしい)
  • gprof が “arm-linux” 向けでないのが問題だと思い、zaurus 上の gprof で gmon.out を処理させてみたが、出力は x86 Linux の gprof 変わらなかった
  • 当然最適化は off
  • 使用しているのは QT 込みの C++
  • コンパイル・リンクに使用したツールは 宝箱Pro SLシリーズ関連 開発ツール一覧 より落した純正のもの。

固定小数点演算化 timidity の方は正常に profile とれているように見えるのだが、何が違うのだろうか……。