よくアイデアは枕上、馬上、厠上といいますが、
トイレや車の運転中はあまり無いなぁ…
おいらは自転車かお風呂入ってるときみたい。
で、風呂入りながらふと思いついた!
ネコロジーPCのプログラムの処理速度。
http://picavr.uunyan.com/avr_m_logianaPC.html
シリアルポートから1行1行データを読み込む
時の処理速度が気に入らないんですよ。
ネコロジーAVRからシリアルポート経由で32kB分の
ダンプデータを読み込む際のトラフィックは約100kB。
115.2kBpsなら計算上は約10秒で済むはず。
10秒以上掛かってるよなぁ…
そういえば、このバージョンになる前はもっと時間が
掛かってて、30秒以上だったんだよな。その時の
原因は確かガベージコレクションだったかな?
で、今開示しているバージョンは理論上の伝送時間に
あるていど近づいたので公開したんですが、まだ
なんとなく計算値より遅いことが気になってました。
で、風呂入ってぼーーーーっと考えてたら、なんとなく
思いあたるものが…。
多分、ループ1回毎に文字変数を動的割り当てしてる
ことが問題なんだろうな。
正確に言うと、32k÷16=2048回ほど文字列を
動的割り当てしてるロジックになってること。
ってことは、あらかじめ静的にメモリを確保しておいて、
そこに読み込んだデータを放り込んでいくなら、
メモリ割り当てのオーバーヘッド時間はほぼゼロの
はずなんだよな。
C言語ならmalloc関数で割り当てられるんだろうけど、
VBで文字配列を静的割り当てすることって出来るのかな?
うーん、そもそもVBってあらかじめメモリ上に
割り当ておいた文字列変数を更新するときに、
元のメモリを上書き使用してくれるのかな?
じゃないと元の木阿弥なんだよな…
でもまぁ、何千回も動的にメモリを割り当て直して
いることが原因と考えて間違えないだろうな…
そういえば、そもそも本当に文字列の扱いで遅く
なっているのかなぁ?それとも実はシリアルデータ
の入力時のタスク切替に伴うオーバーヘッド
なのかな?もしそうだとすると、頑張っても
これ以上は速くならないだろうな。
少なくとも、tera-termで普通に受信できるってことを
考えると、AVRより二桁速いペンティアム4で
受信できないなんてことは考えられないんだけどな。
20MhzのAVRに出来て、ペンティアム4に
出来ないなんて、どう考えてもおかしい!
昔ながらの言語って、中でどんな処理してるかが
想像付くんだけど、VBにしても最近のスクリプト系
言語(rubyとかPHPとか)にしても、メモリの
アロケーションとかをランタイムライブラリが
どういう風に処理してるかわかんないから、
どう対応したらいいのかが想像つかないんだよな…
勝手にやられちゃうから…
データ量が小さい時は気にも留めない程度の話
なんだけど、こうやって扱うデータの桁が増えるに
つれて、あっという間に処理が破綻しちゃうのは
実用上困るな。
まずは原因の切り分けとして、文字配列にデータを
ガンガン放り込んでいくようなテストプログラム
でも書いてみるか…。それで時間が掛かる様なら
原因は絞れるはずだな。
もし文字列の動的割り当てが原因なら、別の方法で
対応可能かも知れないからな…
怖いのは、せっかく決めた「I/Fフォーマット」
に原因があるってケース。
フォーマット自体を変更するってなると、根底から
覆っちゃうからな。そしたらVB以外の言語を探すか…
まずはちょこっと実験してみようか。
|
やねうらおさんのブログを見ていて面白そうなものが。
http://d.hatena.ne.jp/yaneurao/20080102
もう1年以上前の話みたいですが。
Z80のアセンブラ使ってHello,world!を何バイトの
プログラムで実現できるか、ということみたい。
そうそう。この手の話って大好きなんですが、まぁ
当面Z80は扱わないと思うので細かい処理内容
は考えないことにして(考え始めるときっと挑戦
しちゃうから)、これにまつわるあの話を思い出した!
大昔の月刊アスキーで開催していたショートプログラム
のコンテストのこと。
一つは256バイトのマシン語でどんなことが出来るのか?
っていうはなし。もう一つはBASICの1行だけでどんな
ことができるのか?ってはなし。
前者の優勝は、確かPC-8001のスクロール式の
カーレースだったかな。(P8にしては)大きくて綺麗な
グラフィックキャラ、ちゃんと遊べるゲームバランス、
速い処理…と、とても256バイトで実現したとは思えない
できのよさだったんですが、解説には確か自動車の
グラフィックパターンはプログラムのコードを流用
しているって書かれていた記憶が。
当時1バイトにそうやってたくさんの意味を持たせる
っていうことを聞いた時、ははぁ、凄いことを考える
もんだなぁ…ってビックリしたものでした。
後者は、昔のBASICといえば行番号から始まって、
255バイトで1ライン分という機種が大部分だったと
思いますが、その中でどんなことが出来るかって話。
優勝者は…どんなものだったっけな???忘れてしまった…
記憶に残っている中では、平方根だか円周率だかを計算
するプログラムとかあった気がするな。
もちろん内部関数は使わずに、延々と計算していくって
言う話。テイラー展開だったかな?
メモリ空間がギガオーダーになっちゃって、HDDに
至ってはテラオーダーになっちゃったこの時代には
どうでもいい話といえばどうでもいいのですが、
むしろPICやAVRでアセンブラつかって
1バイト、1クロックを削り取ることの心地よさ、
多分この辺りの当時の感動が原点になっているん
だろうな…
あとでアスキー読み返して、感動をあらためて
呼び起こそう…。
|
|
|