ループステートメントの処理速度

2009.9.11 金曜日

ActionScript3ではいくつかのループ処理用のステートメントが用意されていますが、どのステートメントを使用すると処理が速いのか気になり、ちょっと計測してみました。結果は以下のようなグラフになります。短いほど高速処理。

追記・修正 2009.9.23
Loop

コメントで指摘して頂いたとおり、ループ処理内で一度変数に代入する(テストスクリプトの5〜7)と高速化します。新たに計測したデータを追加したグラフは上記 *印 の部分。「while」がちょっとだけ速そうだけど、誤差の範囲かな。

package {
	import flash.display.MovieClip;
	import flash.events.KeyboardEvent;
	import flash.geom.Point;
	import flash.utils.getTimer;

	public class Main extends MovieClip {

		public function Main():void {

			//リスナー登録
			stage.addEventListener(KeyboardEvent.KEY_DOWN, KeyDown);
		}

		//キーが押された場合
		private function KeyDown(e:KeyboardEvent):void {

			//計測時間を出力
			trace(Check(e.keyCode));
		}

		//時間を計測
		private function Check(_key:uint):uint {

			//変数宣言
			var test:uint;

			//開始時間
			var time:uint = getTimer();

			//リストの作成、初期化
			var list:Array = new Array();
			var l:uint = 1000000;
			for (var i:uint = 0; i < l; i ++) {
				list[i] = new Point(i, i);
			}

			//1
			if (_key == 49) {
				for each(var a in list) {
					test = a.x + a.y;
				}
			}

			//2
			else if (_key == 50) {
				for (var b in list) {
					test = list[b].x + list[b].y;
				}
			}

			//3
			else if (_key == 51) {
				for (var c:uint = 0; c < l; c ++) {
					test = list1.x + list1.y;
				}
			}

			//4
			else if (_key == 52) {
				var d:uint = 0;
				while (d < l) {
					test = list[d].x + list[d].y;
					d ++;
				}
			}

			//5
			else if (_key == 53) {
				var f:Point;
				for (var e in list) {
					f = list[e];
					test = f.x + f.y;
				}
			}

			//6
			else if (_key == 54) {
				var h:Point;
				for (var g:uint = 0; g < l; g ++) {
					h = list[g];
					test = h.x + h.y;
				}
			}

			//7
			else if (_key == 55) {
				var j:uint = 0;
				var k:Point;
				while (j < l) {
					k = list[j];
					test = k.x + k.y;
					j ++;
				}
			}

			return(getTimer() - time);
		}
	}
}

Posted by tmdf||comments (1)

ActionScript3 メモ

2009.9.8 火曜日

昔、ActionScript3で使いたいけどよく分からなかった書き方。

//文字列を使って名前がHoge_mcのオブジェクトを参照する時
var name:String = "Hoge_mc";
trace(this[name].x);

//文字列を使ってクラスHogeを生成したい時
import flash.utils.getDefinitionByName;
var name:String = "Hoge";
var linkage:Class = Class(getDefinitionByName(name));
var Hoge_mc:Object = new linkage();

//引数"hoge"をマウスイベントで渡したい時
this.addEventListener(MouseEvent.CLICK, onClick("hoge"));
private function onClick(_param:String):Function {
	return function(e:MouseEvent):void {
		trace(_param);
	}
}

//rootの関数Hogeを呼びたい時
Object(this.root).Hoge();

Posted by tmdf||comments (0)

ActionScript3でプロっぽい書き方

2009.9.7 月曜日

ネット上で公開されているオープンソースとかのクラスライブラリって、中身を覗くとクラスや変数、定数がキレイに整理されていてプロだな、って感じると思います。というわけで、個人的にプロっぽいって感じる書き方を紹介。ポイントは .parent や .root を使って自分より上位のオブジェクトの関数や変数を操作しない、ってこと。

簡単な例を書くと、親(root)にA(A_mc)とB(B_mc)という子がいた場合、AがBに直接「動け!」と命令するのではなく、Aは親に話かけてってアピールし、親がAの話を聞いてBに命令する、というのが理想的な流れになります。

上の例をプログラムにすると以下のようになります。
自分で書いておきながら CustomEvent.as のsuperが何をしているのか正直サッパリ分かっていません。

//Main.as (root)
package {
	import flash.display.MovieClip;

	public class Main extends MovieClip {

		public function Main():void {
			A_mc.addEventListener(CustomEvent.MOVE_B, MoveB);
		}

		private function MoveB(e:CustomEvent):Event {
			B.Move();
		}
	}
}
//A.as (A_mc)
package {
	import flash.display.MovieClip;
	import flash.events.MouseEvent;

	public class A extends MovieClip {

		public function A():void {
			this.addEventListener(MouseEvent.MOUSE_DOWN, onMouseDown);
		}

		private function onMouseDown(e:MouseEvent):Event {
			this.dispatchEvent(new CustomEvent(&amp;quot;move_b&amp;quot;));
		}
	}
}
//B.as (B_mc)
package {
	import flash.display.MovieClip;
	import flash.events.MouseEvent;

	public class B extends MovieClip {

		public function B():void {

		}

		public function Move():void {
			this.x ++;
		}
	}
}
//CustomEvent.as
package {
	import flash.events.Event;

	public class CustomEvent extends Event {

		public static const MOVE_B:String = &amp;quot;move_b&amp;quot;;

		public function CustomEvent(_type:String):void {
			super(_type, false, false);
		}

		public override function clone():Event {
			return new CustomEvent(type);
		}
	}
}

Posted by tmdf||comments (0)

Flashの実行速度が遅くなる 2

2009.8.28 金曜日

Flash PLAYER では、高解像度のビットマップ画像を複数読み込んで、表示させようとすると動作が遅くなることがあります。

勝手な予想ですが、Flash PLAYER はステージに配置された画像のvisible=trueの場合に、キャッシュ(メモリに読み込む)する仕様なのだと思います。キャッシュに必要な時間はスペックに依存するため、PCによっては意外な低解像度画像でも起こりうる問題です。画像を読み込んだ際に、とりあえず全て表示(視覚的に表示したくない場合は、visible=true で alpha=0 にすれば良し)しておくことでこの問題は解決できます。一度キャッシュされると、遅れることなく表示でき、搭載メモリが少なくなければ普通に使っている間はメモリから破棄されません。

Posted by tmdf||comments (0)

Flashの実行速度が遅くなる 1

2009.8.27 木曜日

ずっと自転車ネタばっかりなので久しぶりにFlashの話。

まず、Flashでオブジェクトを非表示にする場合、プロパティのalpha=0、またはvisible=falseを使って非表示にすると思います。見た目は同じになりますが、実行速度はvisible=falseにした方が、明らかに速くなります。alpha=0にした場合は、面倒でもvisible=falseも併せて書いておくといいと思います。注意点として、alpha=0の場合はマウスイベントを取得できますが、visible=falseではできません。visible=falseにしている場合でも、hitTestObject() はできます。

あと、描画にかかる時間ですが、ビットマップ < ベタ(面) < 線 となります。線はできるだけ使わない。フィルタ処理(ぼかしやドロップシャドウなど)も重いので、ダイナミックに変化せずにデータ容量を気にしないなら、何でもビットマップ画像、もしくはcacheAsBitmap=trueにする。でもcacheAsBitmapは使い方(x,y軸移動以外のアニメーションなど)によっては逆に重くなるので注意が必要。

Posted by tmdf||comments (0)

サイクルコンピューター 調査2

2009.8.19 水曜日

前回に引き続き、自分の欲しい順にスピード、ケイデンス、心拍数の3つをワイヤレスで計れるサイコン、残り3つを紹介。

CATEYE CC-TR300TW

CATEYE CC-TR300TW今と同じメーカーの最高グレードのサイコンで、あまり好みじゃないCATEYEらしいデザイン。
メリットは結構安い。充実のラップ機能。2.4GHzデジタルワイヤレス。スピードとケイデンスのセンサーが1つにまとまっているので、後輪だけで計測でき、ローラー台でも使える。
デメリットは混信する、4隅のボタンが固いってレビューを見かける。液晶表示(特にケイデンス)が小さく表示カスタマイズができない。5分以上止まっているとオートスタートしない。データ解析は不可。

追記 2009.9.8
この一体型タイプのセンサーって小径車のようにホイールとクランクが離れている場合は使えない気がする。

Web : CC-TR300TW¥14,000くらい (amazon)

Sunnto t3c Complete Cycling Pack

Sunnto t3c Complete Cycling Packアウトドア系の腕時計(コンパス)メーカーが出している腕時計タイプのサイコン。Vectorは毎日のように使っているし好きなブランドの一つ。心拍センサーは腕時計に標準装備なので、バイクポッドとケイデンスポッドをパックにしたものがコレ。日本国内では、バイクポッドとのパックはあるけど、ケイデンスを含めたパックはたぶん未発売。
メリットは心拍センサーがよくできているらしく悪いレビューを見かけない。2.4GHzデジタルワイヤレス。自転車から降りたあとは腕時計として使える。後からPCポッドなど機能を追加できる。
デメリットは表示領域が狭い。値段が微妙に高い。パックでは腕時計の色が普通のブラックしか選べない。

Web : Suunto Japan サイクリングパック¥24,000くらい (wiggle)

CICLO SPORT CM8.2 (+ Cadence Set & HeartRate Set)

CICLO SPORT CM8.2サイコンについて調べてて初めて知ったドイツのメーカー。実物は見たことがないけど、ランス・アームストロングがツールで使っていたブランドみたいです。
メリットは見やすそうな表示画面。デジタルワイヤレス。
デメリットは一通り揃えるとそれなりの値段。押すときに少し力がいるらしいボタン。レビューがあまりないのでちょっと不安。

Web : CICLO SPORT CM4.2 HR¥21,000くらい (amazon)

以上でサイコンの紹介は終了。買ったらまた記事を書きます。懐に余裕があるなら今回紹介したぐらいの機能(または拡張性のあるタイプ)のモノを最初から買えばいいと思います。使ってみて要らないと思ってもちゃんと売れるし、後からこれぐらいのサイコンが欲しくなった場合に最初のサイコンが無駄になるのでもったいないですしね。

Posted by tmdf||comments (0)

サイクルコンピューター 調査1

2009.8.18 火曜日

Gaap Street と同時に、店員に薦められるがまま買ったサイクルコンピューター(以下、サイコン)「CATEYE CC-RD300W」をずっと使っていますが、グレードアップしたくなってきたので、スピード・ケイデンス・心拍数の3つをワイヤレスで測れるサイコンについて調べました。購入しそうな勢い順にリストアップしていきます。今回は現状のサイコンとトップ2を紹介。残りは今後紹介予定。

CATEYE CC-RD300W

CATEYE CC-RD300Wこのサイコンは、ワイヤレスでスピードだけ測れるタイプ。デザインはソリッドな感じで好き嫌いが分かれそう。私は好きじゃありません。
メリットは安い。軽くて小さいけど見やすい表示。アナログ無線のくせに混信した記憶がない。本体を丸ごとクリックするというシンプルな操作方法。
デメリットは取り外しにちょっとコツがいる。バックライトが無い。

Web : CC-RD300W¥4,000くらい (amazon)

MAVIC Wintech Ultimate (+ Cadence Kit)

MAVIC Wintech Ultimateニュートラルカーで有名なMAVICのサイコン。黄色いロゴが個人的に好き。「MAVIC Wintech HR」でもいいけど、値段が1,000円ぐらいしか変わらないのでこちらを紹介。
メリットは本体が大きいだけあって表示が見やすそう。ボタンなども押しやすいみたい。フロントハブのクイックリリースがスピードセンサーになるのでフォークに装着するタイプよりは見た目がすっきり。2.4GHzデジタルワイヤレス。必要ないけど高度計まで付いている。本体の信頼性が高い(壊れにくい?)という噂。
デメリットは海外通販を使ってもちょっと値段が高い。スピードもケイデンスも最初の反応が少し遅れるらしい。PCでデータ解析ができない。バックライトが無い。

追記 2009.9.9
こういったクイックリリース型のセンサーって間にブレーキのディスクがあると、距離が離れすぎると思いますが大丈夫なんでしょうか?それとも普通とは左右逆にして締めるのかな。あと本日2010年モデルのUSBに直接挿してデータ管理できるタイプが発表されていました。

Web : Mavic Japan¥21,000 くらい(Chain Reaction Cycles)

Polar CS200cad

Polar CS200cadハートレート計測で有名なPolarのサイコン。個人的には一つ上のグレードのCS400までのデザインはかっこいいと思うけど、かなり高くなるので今回は候補外。マーケティングの都合上だろうけど、このCS200とかCS100のデザインは野暮ったくてグッとこない。
メリットは海外通販で買うと同機能のサイコンの中でもかなり安い方。カスタマイズ可能な表示で液晶も見やすく操作ボタンも押しやすそう。ちょっとしたデータ解析もできる。
デメリットはセンサーの電池の交換(自分ですると保障外)費用が日本国内だと2,800円で、センサーを買い足す(海外通販を利用すれば3,000円前後)のとあまり変わらない。防水性能が低いのか故障率が他のサイコンに比べると高いみたい。ケイデンスとかスピード表示が少し遅れる。アナログ無線なので混信しやすそう。写真より実物がかなり安っぽく感じる。

Web : Polar CS200¥14,000くらい (wiggle)

Posted by tmdf||comments (0)

ペダル(トークリップ)交換

2009.8.10 月曜日

Pedal

ビンディングペダルはまだ抵抗があるのでトークリップ(トゥークリップ?)を使っているんですけど、「TIOGA シュアーフット6」がお勧め、って書かれているのをよく見かけるので試しに交換してみました。色は真っ黒のやつ。
トークリップは「Zefal トークリップ43」、トーストラップはたしか「Zefal トーストラップ515(グリーン)」。3点で4,000円ちょっと。街乗りしかしないのでストラップは締め上げずに使っていますが、フラットペダルだけで漕ぐよりは楽です。

Gaap Streetに最初から付いている「Wellgo C-19」には蹴返し(足の裏でひっかけてペダルを反転させるツメ)がないのでトークリップを使うにはちょっと慣れが必要ですが、TIOGAのとあまり変わらない感覚で使いやすかったです。

「Wellgo C-19」は六角レンチ(サイズは忘れました)だけで取り外せますが、「TIOGA シュアーフット6」の取り付けにペダルレンチが必要。ペダルレンチは100均でもあるみたいですけど、私は「Hozan C-200 ペダルレンチ」を使っています。

Posted by tmdf| |comments (0)

ライト購入

2009.8.9 日曜日

Light

今まで「KNOG 1LED LIGHT(ライムグリーン)」を前後で使っていましたが、意外と通勤で自転車を使って夜走ることが多く、暗いと感じていたのでヘルメットと同時にライトもイギリスのWiggleで買いました。

フロント用は「KNOG BEETLE(ブラック)」で2LEDタイプですが、側面や上面まで透明部分が回り込んでいる形で、1LEDの2倍以上明るく感じます。ただ街灯のないような暗い道では力不足なので、対向車などに自分の存在を知らせるのが使用目的に合っていると思います。お値段は£9.18(約1,500円)でした。

リア用には大きめの「KNOG SKINK(ブラック)」を選びました。価格は£12.23(約2,000円)で、4LEDで手で持つとズッシリ感のある重さですが、かなり明るくて存在感はあるはずです。パイプならどこでも巻けそうな感じで伸びます。

Posted by tmdf||comments (0)

ヘルメット購入

2009.8.8 土曜日

Helmet

今まで被っていませんでしたが、ドロップハンドルの自転車でこけると、さすがに頭がヤバそうなのでヘルメットも購入しました。買ったのは無駄に最上級グレードのレースタイプで「BELL VOLT(マットガンメタルxチタニウム)」。細く格子柄が入っていて色は自分のGaap Streetのフレームに似ています。定価は29,400円ですが、サマーセールで¥11,800でした。同じ時期に買った定価6,400円の「BELL SOLAR(イエローxチタン)」と装着感はあまり変わりません。35km/h巡航とかできるくらい速いと違いを体感できるのかな?

20km/h巡航の私が分かる両者の違いは、バリ取りがマシだったり、プリントのズレ(色分けのセンター出しなど)が少ないなど見た目の部分だけ。VOLTもたぶんプリントがズレているB級品だと思いますが、こういった一体成型の製品はキレイに作るのが難しいみたいです。

海外通販のWiggleで買った「BELL SOLAR」は£19.99だったから3,300円くらい?かなり安いと思います。私は優先発送(£3.99追加)を選んで、日曜の深夜(月曜日)に発注、金曜日に横浜に到着でした。タイミングによって多少変わりますが、8,000円以上買えば送料無料で Wiggle お奨め。

追記・修正 2009.12.24
汗をかく時期にちゃんと洗濯したいので、VOLT用のインナーパッドを近くのお店で取り寄せました。Mサイズ用を頼んだはずなのにSサイズ用になっていましたが、サイズはたぶん同じ、色がM=薄青グレー、S=赤です。大体1,000円くらいで、メーカー在庫有で到着まで1週間くらい。

Posted by tmdf||comments (0)

Photo

PROFILE

森田 考陽 [Takaaki Morita]
Twitter: @tmdf
Other: mtdf.net

Designer / Programmer

RECENT POSTS

MONTHLY ARCHIVES