[C言語]リングバッファ、循環バッファ、環状バッファを使おう!

妹「お兄ちゃん、リングバッファってなに?」
兄「リングバッファは循環バッファだよ」
妹「?……お兄ちゃん、循環バッファってなに?」
兄「環状バッファだよ」
妹「??……お兄ちゃん、環状バッファってなに?」
兄「リングバッファだよ」
妹「お兄ちゃん、私の事をバカにしてるよね?」

兄「……十個のデータが必要な物があったとするよね」
妹「うん」
兄「それに一秒に一個データが入ってくる。必要なのは最新の十個だけ。そういうデータがあったとしたら、どんなプログラムにする?」
妹「そんなニーズはない!」
兄「いやあるよ!何言ってんだコイツ……。例えば為替だと過去一月分を残しながら日足をリアルタイムで表示させるプログラムとかだと、一月分以上は必要ない訳だろ……」
妹「じゃあ、あるとして……一秒間に一個……それなら動的配列を作って増やしていくのかな」
兄「そんな事したら最終的には確保できるメモリがなくなって取れなくなるよね」
妹「消せばいいんだ」
兄「一番古いバッファを消せばいいよね」

インデックスが最大配列を超えると0に戻る

妹「なら楽勝だねっ!」

#include "stdio.h"
int main()
{
	int RingBuffer[10];
	int index = 0;
	for(int i = 0;i<1024;i++)
	{
		if(index>=10) index=0;		
		RingBuffer[index]=i;
		index++;
	}
	printf("%d\n",RingBuffer[9]);
	return 0;
}

兄「うーん……」
妹「何か問題あるの?」
兄「いや、ないんだけど……」

#include "stdio.h"
int main()
{
	int RingBuffer[10];
	int index = 0;
	for(int i = 0;i<1024;i++)
	{
		index=i%10;
		RingBuffer[index]=i;
	}
	printf("%d\n",RingBuffer[9]);
	return 0;
}

兄「こう書きたいよね……。実際に剰余計算で意識する事なく使えるっていうのが特徴だから」
妹「%って何なの?」
兄「剰余、余りだよ。例えば上の場合だと、10で割った時のあまりは0から9になるよね」
妹「if文の方が解りやすくない?ソースコードが短くなって少しは速くなるのかもしれないけどさ」
兄「いや、実際に速度もif文の方が速いんだよね……剰余計算コストとif文のコストは剰余計算の方が高いんだ。コンパイラによっても違うかもしれないけど……」

兄「あぁぁぁぁ……やっぱりだ。遅い」
妹「どれくらい違うの?」
兄「Envy X360 AMD Ryzen 7 3700U 2.3GHz ,メモリ16GBで……」
妹「うん」
兄「10万回ずつインデックスを繰り上げてセットするプログラムをループさせて 」
妹「うん……?」
兄「if文は398.5ms , 剰余計算は490.6ms。 平均の差をとると92.1msも違うんだ……」
妹「それって……何秒違うの?」
兄「msはミリセカンド。1000ミリセカンドで1秒だよ。だから0.092秒かな」
妹「それくらいなら気にすることなくない!?書きたい方で書きなよ!」
兄「組み込み制御業界では10ms遅くなるって言うと怒って殴りかかってくる人もいるんだよ」
妹「そんな組み込み制御業界が誤解される事を言わないでよ!」
兄「いや、大げさに言ったけど……。メモリを無駄に使ったり速度を無駄に使ったりしなければ一つ安い機械で動くのに、と舌打ちされる事くらいはあるかも?」
妹「それはお兄ちゃんの会社だけだからね!業界全体のように言わないでよ!?」