Monday, January 10, 2011

unixbenchとsysbench II

ubuntuにsysbenchを入れようとしています。
sysbench自体はsourceforgeからダウンロードできそうです(下記)

wget http://sourceforge.net/projects/sysbench/files/sysbench/0.4.12/sysbench-0.4.12.tar.gz

参考にしたページでは、mysql-develが必要となっています。
でも、ubuntu 64bitバージョンでは普通にapt-getでmysql-develを探してもうまくいきません。

apt-get install mysql-devel
-->Error

このページを参考にすると、ライブラリ名が違っていることがわかります。
【正解】

apt-get install libmysql++-dev


【予告編】次はここでつまずいています。


hiro@ubuntu:~/sysbench/src/sysbench-0.4.12$ libtoolize --force --copy
libtoolize: putting auxiliary files in AC_CONFIG_AUX_DIR, `config'.
libtoolize: copying file `config/ltmain.sh'
libtoolize: You should add the contents of the following files to `aclocal.m4':
libtoolize: `/usr/share/aclocal/ltversion.m4'
libtoolize: `/usr/share/aclocal/ltsugar.m4'
libtoolize: Consider adding `AC_CONFIG_MACRO_DIR([m4])' to configure.ac and
libtoolize: rerunning libtoolize, to keep the correct libtool macros in-tree.
libtoolize: Consider adding `-I m4' to ACLOCAL_AMFLAGS in Makefile.am.

unixbenchとsysbench

マイマシンではubuntu desktopの64bit版を仮想アプライアンス化し、
vmware player上で起動して、Go開発環境としています。
//Goはとてもインスパイアされる言語です。
//Goでは直感的なマルチスレッド化が可能で、私が目指している
//「子供たち向けプログラム」を作る上でも直感性は必須なので、参考にさせていただいています。
Goのプログラムがコンパイルされて実行される時間が早いのか遅いのかを考えるために、
ベンチマークテストをやってみるとどうなるのかが知りたかったので、
unixbench、sysbenchをやることにしました。
まずはunixbenchの結果から。

[やり方]
こちらを参考にさせていただきました。http://goo.gl/wdP5T

unixbenchの結果はこちら。



========================================================================
BYTE UNIX Benchmarks (Version 5.1.2)

System: ubuntu: GNU/Linux
OS: GNU/Linux -- 2.6.32-25-generic -- #45-Ubuntu SMP Sat Oct 16 19:52:42 UTC 2010
Machine: x86_64 (unknown)
Language: en_US.utf8 (charmap="UTF-8", collate="UTF-8")
CPU 0: Intel(R) Core(TM) i5 CPU 650 @ 3.20GHz (6383.6 bogomips)
x86-64, MMX, Physical Address Ext, SYSENTER/SYSEXIT, SYSCALL/SYSRET
04:09:42 up 8 days, 4:00, 2 users, load average: 0.16, 0.21, 0.18; runlevel 2

------------------------------------------------------------------------
Benchmark Run: Mon Jan 10 2011 04:09:42 - 04:37:47
1 CPU in system; running 1 parallel copy of tests

Dhrystone 2 using register variables 33669499.9 lps (10.0 s, 7 samples)
Double-Precision Whetstone 4066.7 MWIPS (9.9 s, 7 samples)
Execl Throughput 4711.2 lps (30.0 s, 2 samples)
File Copy 1024 bufsize 2000 maxblocks 887767.4 KBps (30.0 s, 2 samples)
File Copy 256 bufsize 500 maxblocks 307965.2 KBps (30.0 s, 2 samples)
File Copy 4096 bufsize 8000 maxblocks 1596808.8 KBps (30.0 s, 2 samples)
Pipe Throughput 2302810.2 lps (10.0 s, 7 samples)
Pipe-based Context Switching 418146.4 lps (10.0 s, 7 samples)
Process Creation 14305.6 lps (30.0 s, 2 samples)
Shell Scripts (1 concurrent) 6419.8 lpm (60.0 s, 2 samples)
Shell Scripts (8 concurrent) 802.4 lpm (60.0 s, 2 samples)
System Call Overhead 4276356.3 lps (10.0 s, 7 samples)

System Benchmarks Index Values BASELINE RESULT INDEX
Dhrystone 2 using register variables 116700.0 33669499.9 2885.1
Double-Precision Whetstone 55.0 4066.7 739.4
Execl Throughput 43.0 4711.2 1095.6
File Copy 1024 bufsize 2000 maxblocks 3960.0 887767.4 2241.8
File Copy 256 bufsize 500 maxblocks 1655.0 307965.2 1860.8
File Copy 4096 bufsize 8000 maxblocks 5800.0 1596808.8 2753.1
Pipe Throughput 12440.0 2302810.2 1851.1
Pipe-based Context Switching 4000.0 418146.4 1045.4
Process Creation 126.0 14305.6 1135.4
Shell Scripts (1 concurrent) 42.4 6419.8 1514.1
Shell Scripts (8 concurrent) 6.0 802.4 1337.3
System Call Overhead 15000.0 4276356.3 2850.9
========
System Benchmarks Index Score 1625.6


そこそこいい結果みたいなので、満足しています。
チューニングなどは今後おいおいやっていきます。

Saturday, January 08, 2011

Android/ グラデーションを描画する(GradientDrawable)

前回、SurfaceViewでの描画でつまずいたに続きまして、
またまたAndroidの描画でつまずいてみましたのでご報告。

[PROBLEM: NO IDEA TO DRAW GRADATION]
【つまずき】
グラデーションをどのように描画すればいいのですか?

【解決プロセス】
GradientDrawableを使えば良さそうなことはさすがにドキュメントからわかりました。
でも、いろんな開発者が「これじゃわかんないよ」と言っているようで、僕にはこのドキュメントから使い方を読み解くことはできませんでした。
そこで、こちらを参考にしました。http://softwareobjects.net/technology/other/how-to-create-android-live-wallpaper/

【先に結果をば】
[RESULT: PASSED]


【コードと解決手段】
[SOLUTION: USE GradientDrawable]
手順1.GradientDrawableを作る(その時、グラデーション方向や色を指定)
手順2.GradientDrawableで描画する領域の境界をRect型で指定する
手順3.GradientDrawableのdraw関数を呼び出して描画する

[FYI: HERE IS A SAMPLE CODE]
コードは下記です。

GradientDrawable mGradient = new GradientDrawable(
Orientation.LEFT_RIGHT,
new int[] { 0xff303030, 0xff777777 });
mGradient.setBounds(new Rect(0,0,getWidth()/2,getHeight()));
mGradient.draw(canvas);

Wednesday, January 05, 2011

Android/ SurfaceView内のThreadから描画するときはHandler不要

兼ねてよりの夢であった子供用プログラミング環境をつくろう!と、
Androidプログラミングをこの正月に本格的に始めました。
Androidプログラミングのほとんどは、ウィンドウ(Activity)の制御からスレッド制御までJavaで記述します。

今日は、Androidプログラミングでの私の間違いIを紹介します。

開始から一週間ですが、一日数回はつまずいております。
Androidならではだと思われる作法があったためです。
最たるものとして下記があるでしょう。
Viewを制御できるのはシングルスレッド

この制約から解き放たれマルチスレッドからView制御をしたい場合は
Handlerというキューを作る。そこにView制御をキューイングしておく。

を守らねばなりません。
これは、いくつかのブログを参照して得た情報でした。
そこでこんなコードになっていました。

Thread th = new Thread() {
public void run() {
mHandler.post(new Runnable() {
public void run() {
Canvas canvas = getHolder().lockCanvas();
if (canvas != null) {
onDraw(canvas);
getHolder().unlockCanvasAndPost(canvas);
}
}
});
}
};



minghaiさんのブログは参考にさせていただいてますが、そこの記述では
http://goo.gl/vXLg8 通常のViewではHandlerを用いて画面更新を依頼することになるのですが、SurfaceViewでは自分で用意したThreadの中でCanvasを取得して画面領域をロックして、描画を終わったら一気に更新ということが可能です。

ということでした。

【間違い1】SurfaceViewではHandlerはいらない

【間違い訂正後】
ということで下記のようになります。

Thread th = new Thread() {
public void run() {
Canvas canvas = getHolder().lockCanvas();
if (canvas != null) {
onDraw(canvas);
getHolder().unlockCanvasAndPost(canvas);
}
}
};