2017年8月10日木曜日

変わらずmandelとかjavascriptとか・・・

C#でのmandel描画を高速化する方法を調べたけど現状の力ではむりぽ

javascriptの描画速度が1300msあたりと書いたけど35万回繰り返される中の計算式を若干改良・簡素化したものが見つかったので実行すると600msと約2倍高速だ。

内部は遅いほうが



       function drawMandel(){
            var canvas = document.getElementById('myCanvas');
            /* canvas要素の存在チェックとCanvas未対応ブラウザの対処 */
           if ( ! canvas || ! canvas.getContext ) {
             return false;
           }
           
           /* 2Dコンテキスト */
           var ctx = canvas.getContext('2d');
           /* mandelbrot */
           ctx.beginPath();

           var ww=640;
           var hh=480;
                      cols = new Array("black", "blue", "red", "magenta", "lime", "aqua", "yellow", "white");
           
           ctx.fillStyle = "Black";
           ctx.fillRect(0, 0, ww, hh);

           var kl =100;
           var rb = -2.5;
           var re = 1.2;
           var ib = -1.35;
           var ie = 1.35;
           var dr = (re-rb)/ww;
           var di = (ie-ib)/hh;
           var k = 0;
           var cr = rb;
           for(var kr=0;kr 4) break;
                   }
                   if (k < kl) {
                      ctx.strokeStyle=cols[k % 7 + 1];
                      ctx.strokeRect(kr,ki,0,1);
                   }
                   ci += di;
               }
               cr += dr;
           } 
        }
となっていて速い方は

 function draw2() {
    var cx=cvs.width;
    var cy=cvs.height;
    var kl = 100;
    var rb = -2.5;
    var re = 1.2;
    var ib = -1.35;
    var ie = 1.35;
    var dr = (re - rb) / cx;
    var di = (ie - ib) / cy;
    
    var st = new Date();
    for(var dx = 0;dx
となっている。どう違う?

なんかリストが見えないぞ!!!!

2017年8月8日火曜日

ついにJavaでMandel

あれこれ悩んでついにJavaでMandelbrotを書いた。

(基本的な実験記述がすんでからはjavascriptのソースをコピペして
 変数の宣言部をvarから該当する型に書き換えただけ)

なんだか実にサクサク書ける気がした。
それとNetbeans良いかもって感じ。
エラーのサジェストと直しが親切だしJavaの書き方とあいまって好み。

画面を見るとjavaの実行時間が89msでC#が463msで大変な差のように見えるが実際はそこまでの差はない。何度か実行するとjavaは100msぐらいでC#が300msぐらいで3倍位の差だ。(まあそれでも結構な差ではあるが・・・)

それと自分の環境ではWindowsを早くしたくて設定で余分な修飾をできるだけ付けないようにしているがC#のWindows部品の表現の素っ気無さに比べてjavaはボタンも角丸でテキストボックスも影付きでなかなか格好が良い。

C#のFormにはsetPixcelという点を描画する専用の命令があるがjavaは無いのでdrawlineで代用している。line系で代用する言語はruby/Tkなど多かったがline(x,y,x+1,y)などのようにx(またはy)を+1までしないと何も描画してくれないことが多かったがjavaはdrawLine(x,y,x,y);としてもちゃんと描いてくれた。結果としてjavascriptなど+1するものよりもdotのにじみが少なく思う。

またコンパイル系言語でのオブジェクトサイズについて考察すると
java :  8kB
c#   : 10kB
Lazarus : 15215kB
ActiveBasic : 44kB
で、javaとC#がほぼ同程度、ActiveBasicがやや大きめ、Lazarusはすべてのライブラリーを同梱しちゃうのかやたらと大きい(15MBって??)
javascriptとrubyはインタープリタだしAccessはMDBなのでサイズを比べることに無理がある。(ちなみにAccessは648kB)

実行時間は

  1. java :: 100ms
  2. C#  :: 300ms (formのthisのgraphicsに描くとこのスピードだが
             bitmapを利用すると200msと改善はする。)
  3. Access :: 940ms
  4. javascript :: 1280ms(chrome)
  5. lazarus :: 1300ms
  6. ruby :: 57秒547ms(57547msって!!)
rubyはデスクトップの記述はあきらめてsinatraの記述などに振り向けようと思わせる数字


2017年8月7日月曜日

javascriptでもmandel

javascriptでマンデルブローを書いてみた
もちろん同じ条件で、結果もおなじになるようにこだわった。

結果は約1.25秒ぐらい
コンパイラのactiveBasicの倍くらい速いので良しとする。
ちなみにインタープリタのjavascriptはブラウザごとにエンジンが異なるのでieとfirefoxでもやった見た。
結果は?
firefox 883ms 優秀!!
ie 1083ms 意外とchromeよりも速い!

chromeで常時開いている10ぐらいのタブが結果を悪くしているのかもって考えてシークレットウィンドでもやってみた。結果は特に速くならないので今のchromeの実力がこれか?まあ我慢の範囲

辛いのはjavascriptで結果が現れずにだんまりになるとき
大抵は変なタイポでエラーになっていることが多いけどわからない
(chromeのF12 コンソールは本当に助かる)
配列の要素参照が()ではなくて、[]なんて忘れてるっていうか・・・
まあでも書けなくもないなあっていうのが感想か?

2017年8月4日金曜日

またしてもmandel

mandelbrotが好きなのでいろいろな言語で書いてみる。

厳密に画面サイズを640x480にしておかないと全くベンチマークとしては役に立たない。
activebasicとC#でもやっている。

結果は0.3秒と2.6秒で8倍以上の開きがある。
tkで書いたrubyもやってみたが76秒と結構遅い。

c#とrubyは複素数のライブラリーがあるので飽和計算のところが定義通りで綺麗でシンプル。

VSが遅いことを除けばC#は素晴らしい。
言語もわかりやすいしLazarusと言うかfreepascalほどの過剰な厳密さもないので
型の変換も文字列代入のときなど結構よしなにしてくれる。

activebasicはエディタの助けとか期待できないのでけっこうめんどくさい。
もはやエディタや総合環境の助けなしにはコーディングもかったるい。

ちなみに最初の結果を並べたときに印象が違うのでカラーのインデクスを間違えたかと思ったがどうも緑色の表現が違うみたいでカラーを色で呼ぶときにRGB=(0,255,0)はC#やLazarusではgreenではなくてLimeであった。

過去の記憶ではインタープリタとしてはめっちゃ速かった記憶があるjavascriptと環境(グラフィックアクセラレータの有無)でかなり実効速度が変わるjavaをサイズや色を合わせて再度記述したら当面はOKとする。
(もう古いBASICなどで書いてみても面白がる人もいないので・・・時間の無駄)

mandelbrot大好き

PC言語をいじるときに性能を見るのにしばしばマンデルブロー集合の描画をしてみる。
以前にも業務報告システムとしてのサイボウズで揚げていたがいかんせんプログラミングをしない自称(BASIC)プログラマの社長だけが読み手だったので張り合いのないこと夥しい。

それならいっそもっと具体的な感想も含めて自分ブログであるここに挙げるほうが楽しい。

で、肝心のmandelbrotなのだが以前に書いたaccess版と今回書いたLazarus版がほぼほぼ同じ速さなのはpascal compilerファンとしては残念。まあそれだけaccessががんばっているのだけど・・・
しかしaccessの1.01秒は優秀、lazarusの1170msも悪くない。

でも収穫もちょっとはあった。pascalは書いていて文法がシンプルで楽しい。
出来ることが限られているくせに煩雑な感じと残念感で彩られたBASIC(古い)とは大違い。書いているうちになんだかクリアになっていくのはすばらしい。

dosvaxj3が更新されていた。

 最近、エミュレータ系をあまり触っていなかったのだけど久しぶりに見てみたらタイトルのようにdosvaxj3が更新されていた。 on emulatorでセルフにcなどのソースを書いて実行するのに母艦側の特定のフォルダをドライブとしてマウント出来たり普通に母艦のimeで漢字が入力でき...