dポイントプレゼントキャンペーン実施中!

プログラミングについて。
1つのループで
Aという計算と
Bという計算をするのと
これらを分けて2つのループにするのって
計算量同じですよね?

もし違うなら理由も教えて欲しいです

A 回答 (7件)

Cだったら一緒。


pythonとかインタプリタ系だったら多分違う。

ま、人間の目でわかる事はないと思うがね^^;
    • good
    • 2

Aの計算とBの計算だけに着眼すればどちらも同じ計算量です。

ただ「プログラム全体の処理量」として考えれば「ループの為の計算」も行っておりますので後者の方が全体の計算量は増えます。

以下は長いので興味があればお読みください。

・一つのループでAとBの計算をまとめて10回まわす
 Aの計算x10、Bの計算x10、ループの計算x10

・Aの計算とBの計算をそれぞれ別の10回ループに分ける
 Aの計算x10、Aのためのループ計算x10
 Bの計算x10、Bのためのループ計算x10

となります。

そういう話題が盛んにされていた時代があります。高速化手法としてマニアな人がよくやってました(私もやってましたよ)。

ループ処理(の計算)に相当する部分をオーバーヘッドと言います。(本来目的としている)「Aの計算」「Bの計算」以外の計算処理を行っているわけですので「この部分の処理量を減らす」事が高速化に繋がります。

昔よくあったのは「同じ計算を2個並べるとループ数は半分で済む」と言う発想です。Aの計算と次のAの計算を並べて書くわけです。すると10回計算する必要があっても5回ループ済むわけです。ループ計算x5となり10回ループするより「やや高速化」が出来ます。

「高速化のためにループを使わず何百個も処理を羅列して
 書いた時代もあった」

力技です。プログラムも読みづらくなりますし、気遣いも多くなります。そこで「コンパイラがアセンブラへ展開する時に自動でループ処理を省いて羅列に変換(展開)していた」という時代もありました。

「しかしループ展開を多用するとプログラム用のメモリ量
 が増える。メモリが安くなった時代に重用された考え方
 である。後にキャッシュメモリをはみ出すという事態に
 なり、かえって遅くなると言われて消えた」

というわけでメモリより処理速度が尊ばれていた時代ではコンパイラ自体がループ処理を積極的に展開しておりました。CPU内にキャッシュを実装するのが当たり前に成ってからは「キャッシュメモリの消費量」の方が大事にされてしまいました。話が戻ってしまいました(単一の処理ループのサイズが巨大になると、小さなキャッシュ・エリアからはみ出す確率が大きく成り、キャッシュの読み直しと言うオーバーヘッドによって余計に遅くなる)

そして並列処理や並行処理、パイプライン処理と言う発想が出てくるとまた違ってきます。

「同時に計算しても処理矛盾を起こさない部分はどこなの
 だろうか?」

Aの計算をした結果をBの計算で行うなど「順序関係」があるとAの計算とBの計算は同時に出来ません。しかし「順序的な制約が無い場合」はAの計算とBの計算を「複数のプロセッサで同時に手分けして計算」した方が早く成ります。コアが沢山あるCPUは早いとされていますが「プログラマの記述によっては恩恵が得られない」という場合も出てくるわけです。

「面倒な時代になった」

そのため「ここまでを塊とする」と宣言し「プロセッサに割り当てやすいようにプログラムを予め分けて置く」というやり方もあります。勿論、実際の割り当てがどうなるかは分かりません。そうしておくことで「並列・並行処理」を想定した記述であると評価される場合(どちらかと言うと言張る感じですがね)もあると言われていました。

ドレが良いのか分からなくなりますよね。

「結局のところ処理系(実際に動くときのマシンの都合)を
 意識してしまうと汎用性に欠けてしまう。逆に遅くなる事
 もありそうなのでプログラマは考えない方が良いだろう」

とされています。

ただし「工業製品や軍事兵器」の様なハード括りつけのソフトの場合は「ハードの都合を考えてプログラム構造を変える」事が必須に成ります。そういう場所で活躍できる人は意外と少ないので現代では希少でしょう。別格扱いされます。学問として習う場合も「高速化テクニック」を教えられる事はあると思います。

現代では「パイプライン処理を意識したコンパイラ」があり(C#などでも盛んに導入されている)ます。なのでループ構造だけで記述をするのは「ややトラディショナル」になっています(普通にループで処理するよりバカっぱやい)

と言う事で「計算量」だけに着眼していると「遅いプログラムしか作れない自分」に成ってしまうのでご用心です。

「単に正常に動いたというのではまだまだ甘い。記述
 によって速度が変わるのか(その処理系で)何度も
 試して『使えそうなモノ』を覚えて置くべき。ここ
 でプロの腕の差が出てきてしまう」

例えばメタセコイヤと言う3Dメッシュ(ポリコン)のデザイン・ツールがあります。これのセーブ・データは別のツールでも読み込めるんですよね。

で気が付くことがあります。

「ん? 読み込み遅いなあ。データ大きいからかな?」

です。

「いや可笑しいだろ? 何でメタセコイヤの方は一瞬で
 読み込めるんだよ? この違いは何だよ?」

ですよねえ。

と言う事で私も3Dプログラミングをするので「読み込み部分」自作してみたことがあります。すると「おっそ~い」と自分に幻滅。本家のメタ勢子のスピードに全く勝てません。

この時は「マシン語時代の若かりし頃の血」が騒ぎましたね。コンチキショウ「やってやろうじゃないか?」見たいに思いまして。高速化を(PCアプリの様なものでも高速化記述は可能である)やりました。結果「本家とそん色ないスピード」で読めましたよ。

その時思ったのは「高速化は意識しても意味がない」と言う定説は全くの嘘で「実際に数百倍の差が出る」と言う事です。

「2分かかった読み込みが秒かからん」

でまあ私がやった高速化ノウハウは今の時代ではロスト・テクノロジーでしょう。殆どのプログラマは出来ないと思います。(メタ勢子作った人は普通にやってたわけですけど)この差がプログラマ同士で生じてしまうという事が怖いんですよ。普通にやってたら逆立ちしても勝てんという相手が出てくるのでこの世界は面白いんです。

「通常の3倍のスピードどころじゃない。100倍くらいの
 処理速度で差を付けられる。そしてどう頑張ってもその
 速度を出せないプログラマが大量にいる。未だにこうい
 うガチの世界」

こう言う話を誰か漫画にしてくれないかと思いますが(分かる人の方が少ないので)中々ありませんなあ。足指まで使ってキーボードを叩きまくる謎のハッカーが描かれるだけです。曲芸ですかね。

以上、蛇足でしたがご参考になれば。
    • good
    • 1

「計算量」をどういう定義で使っているかによります。



コンピュータ工学分野で計算量というと、いわゆる「オーダー」のことになります。
https://ja.wikipedia.org/wiki/%E8%A8%88%E7%AE%97 …

これはおそらく変わりません。


実行命令数とか実行時間(クロック)等を指しているのなら

ループは1つの繰り返し毎に継続するかの判定が行われます。
同じ回数のループが2つあれば判定回数は2倍になります。


ただ、昨今では
・ループ判定くらいは一瞬
・最適化とかキャッシュ等の仕組みとかで命令数がそのまま速度になるとは限らない
等があり「やってみないとわからない」こともあります。
    • good
    • 0

Aの計算とBの計算のループ条件(開始の設定、終了の判定)が同じならば、1つのループの方が計算量は必ず少なくなります。

    • good
    • 2

コンパイルしたオブジェクトの計算量だけを見ると同じに見えますが、実行時にオブジェクトを先読みしたキャッシュヒット率を考えると、ループせずに真っすぐ実行した方が高くなりますので、一つのループの方が実行速度は速くなります。

    • good
    • 2

答えは同じになるとしても、



ループというのは簡単に言うと、

i に 0 を代入する
Aという計算処理を行う
i に 1 を足す
i が一定数以上であるか比較し一定数未満である場合は最初に戻る

という処理です。
ループ処理自体が、演算と判断を含んでいるので、
一つのループで処理したほうが効率の良い場合もあります。
    • good
    • 0

はい、同じになります。

    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています


このQ&Aを見た人がよく見るQ&A