読者です 読者をやめる 読者になる 読者になる

たいちょーの雑記

ぼくが3日に一度くらい雑記をかくところ

bashでスタック計算機を作ってC#版と速度比較したのん

bashでスタック計算機作ったよ

github.com

ひとつ前の記事で課題でスタック計算機を作ることになったことを書きました。
xztaityozx.hatenablog.com

そのうちの一つ(bash版)ができたのでご査収ください。

やはりbashにはC#みたいにStack<T>なんていう便利なものはありませんからそこから実装するのはなかなか手応えありましたね。
コード見てもらったらわかると思うんですが pop()周りがなんか変です。

function pop(){
   rt=${stack[$SP]}
   echo $rt   
}

スタックポインタを減らす部分を書いてないです。
でも、それがないと動かないので121とか125行目に無理やり書いてます。
なんでそんなことしてるかっていうとpop()内にexprを使って書いたけど動かなかったからです。
ここだけがなんか変なんでつらいです。

* の罠

*ワイルドカード)はマッチングとかする時にすげー便利ですよねーー。
でもこれ今回の課題ではすげー邪魔でした。
なんでかというと*ワイルドカードだからです。(二度手間)

課題の仕様は4 5 *と入力できることでした。これ、readコマンドで受け取ると
bashSide1
こんな風にファイルが全部展開されちゃいます。まぁそれが機能ですからね
これをエスケープするには/*とするんですが、これは仕様通りの入力ではないんで採用できないでです。

な の で

75行目ぐらいの

args=${args//\*/x}

これ置換とかちゃんと学んでないんでなんでこうなってんのという気持ちでいっぱいなんですがこれで*xに書き換えてます。
(参考)
d.hatena.ne.jp

速度をくらべYO

C#版とbash版で速度の比較をしました。
最初はtimeコマンドを使って

#!/bin/bash

for((i=0;i<10000;i++));do
    ./テスト対象 < input.txt > /dev/null
done

これを測ってたんです。

C#の方が鬼のように遅い
bash
bashSide2
C#
bashSide3

なんなんだろーと思ってたたら心強いTweetが

してなかった。

Visual StudioのビルドをReleaseにして、今度はMeasure-Commandでやってみたんです。
そしたら

むしろ遅くなった あまりにも遅かったので待てなくてSSはないですけど6分ぐらい経ってた気がします。

え?なんで?

あああああ!なるほど!

早速Stopwatchクラスを使って10000回の実行時間測ったら 0.44秒 で終わりました。ありがとうございます。

まぁそらそうですよねって感じです。毎回プログラム読み出してたらそら遅いですわなって感じです。
何回もtimeが終わるのを待っていた自分が恥ずかしいです。はい。
でもこれで学んだので同じことはしないです。

コンパイルの時間とかも計算する必要があると思うのでmcstimeに通してみたら。
bashSide4
0.24秒 だったのでbashなんかより圧倒的に速いですね。

インタプリタコンパイラ比較しますぅ~~~とかテキトーなこと言っただけなんですが割といい経験になりました。