PCは一体一瞬の間にどれほどの処理を行えるのか。

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
アバター
namari
記事: 111
登録日時: 11年前

PCは一体一瞬の間にどれほどの処理を行えるのか。

#1

投稿記事 by namari » 10年前

なんだかふわっとした質問で申し訳ありません。
今回は現在のところそこまで困っていないのですが、興味と後学のためにお願い致します。

コード:

#define WIDTH 55
#define HEIGHT 35
		for(i=0;i<=(HEIGHT-2)*(WIDTH-2);i++){//ここの処理すごく大きい。(初期設定でだいたい300万回中身を処理する)
			for (m=0; m<=HEIGHT-1; m++) {
			        for (n=0; n<=WIDTH-1; n++) {
						if(last_block[m][n]==2){
							if(last_block[m+1][n]==1){last_block[m+1][n]=2;}
							if(last_block[m-1][n]==1){last_block[m-1][n]=2;}
							if(last_block[m][n+1]==1){last_block[m][n+1]=2;}
							if(last_block[m][n-1]==1){last_block[m][n-1]=2;}
						}
			        }
			}
		}
このようにfor文にfor文を重ね、PCに悪そうな処理を作りました。(普通にプレイして5分に一回ほど行なう処理)
そもそもこの処理自体大きすぎた、後で小さくしようと思いつつのテスト・デバッグだったのですが、
恐ろしいことにこの処理で一切止まること無く、最後まで処理しきってしまいました。

この結果が僕のPCに依存しているのは分かります。
しかし、ゲームを公開すると色んなスペックのPCがプレイすると思います。
PCを1つしか持っていないのでテストもできません。

そこで今回聞きたいのは、1フレームの間に大したスペックのないPCが安定して出来る処理とは何行ぐらいなんでしょうか。
(明らかにその一行の処理の内容にかなり左右されそうですので、簡単のためにその一行はただの代入処理ということで。)
そして、上記の作業はその安全圏にいるのでしょうか。

条件が曖昧も曖昧なので曖昧で構いません、安全圏の処理数を教えて下さい・・・。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 13年前
住所: 東海地方
連絡を取る:

Re: PCは一体一瞬の間にどれほどの処理を行えるのか。

#2

投稿記事 by softya(ソフト屋) » 10年前

それは具体的には難しいです。ご自身で言われる通り環境にすごく依存します。

>恐ろしいことにこの処理で一切止まること無く、最後まで処理しきってしまいました。

細かい環境など不明ですがどういう異常事態で止まると思われたのでしょうか?
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

taketoshi
記事: 222
登録日時: 13年前
住所: 日本国

Re: PCは一体一瞬の間にどれほどの処理を行えるのか。

#3

投稿記事 by taketoshi » 10年前

PCの演算能力はCPUの演算能力とメモリのアクセス速度で決まるんでしょうが。
昨今のPCじゃ300万回くらいじゃ一瞬で処理しちゃうんですね。

試しに以下のコードを走らせたところ終了まで5秒位かかりました。試行回数は30億回です。

コード:

// aetes.cpp : コンソール アプリケーションのエントリ ポイントを定義します。
//

#include "stdafx.h"


int _tmain(int argc, _TCHAR* argv[])
{

	int x = 0;
	for(int i = 0;i < 3000000000;++i){
		x++;
	}
	return 0;
}


ただ。ここにprintf命令を入れ結果をディスプレイに表示しようものなら
表示に時間がかかり何時間かかるか見当もつきませぬ。

アバター
namari
記事: 111
登録日時: 11年前

Re: PCは一体一瞬の間にどれほどの処理を行えるのか。

#4

投稿記事 by namari » 10年前

>softya(ソフト屋) さん
止まるというのは表現がおかしかったですね。
1フレームで処理しきれないことによる処理落ちがなかったんです。
(本当は少しあったのかもしれませんが、反射神経の問題で捉えられませんでした。
まあそれほど一瞬だったという意味です。)

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 13年前
住所: 東海地方
連絡を取る:

Re: PCは一体一瞬の間にどれほどの処理を行えるのか。

#5

投稿記事 by softya(ソフト屋) » 10年前

速度の話で、その要素というのが大事です。
PCの中に閉じた処理の中で一番遅いのはファイル処理ですが、それを除くとしてメモリへのアクセスが次に遅い処理でどれだけの範囲のメモリにアクセスを1フレーム内に行うかで速度は大きく左右されます。
CPUにはキャッシュがあるので狭い範囲のメモリアクセスはキャッシュが速度差を吸収してしまいますからテストコードでは検証が難しいのです。
メモリへのアクセスは命令とデータが有り、それぞれCPU種類ごとにキャッシュや命令プリフェッチ、命令パイプラインなどアーキテクチャが違うので厳密には問えません。
大体の値は実際に近い処理か本物で実測してみるしかありません。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

アバター
namari
記事: 111
登録日時: 11年前

Re: PCは一体一瞬の間にどれほどの処理を行えるのか。

#6

投稿記事 by namari » 10年前

>taketoshiさん
なるほど・・・これで少なくともtaketoshiさんのPCで30fpsのゲームをするとして、
x++;の処理に関しては30億回:5秒 30億回:150フレーム 2000万回:1フレームというわけで、
2000万回以下までは問題なくできそうになるわけですね。

しかし、taketoshiさん、softya(ソフト屋)さんの仰る通り、いくつもの要素で左右されるようですね。
結論としては、要求する最低スペックのPCで、今回行なう作業に関するtaketoshiさんのようなテストを行ない、(x++;を行う処理を他の処理に書き換えて)
上記のような計算から、大丈夫そうな回数の見積もりを立てるぐらいでしょうか・・・。
それでもsoftya(ソフト屋)さんの仰る通り、かなり誤差が大きそうなので、何回か試行を行ない、
その見積りから相当数小さくした値が安全に動作するだろう値といったところでしょうか。

アバター
みけCAT
記事: 6734
登録日時: 13年前
住所: 千葉県
連絡を取る:

Re: PCは一体一瞬の間にどれほどの処理を行えるのか。

#7

投稿記事 by みけCAT » 10年前

実行回数は、具体的な行単位で計るよりもループ処理の回数で大雑把に見積もった方がいいと思います。
最近のPC(CPUクロック1GHz程度)では、1秒で大体1,000,000~10,000,000処理をできると考えると、大抵の場合うまくいくはずです。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 13年前
住所: 東海地方
連絡を取る:

Re: PCは一体一瞬の間にどれほどの処理を行えるのか。

#8

投稿記事 by softya(ソフト屋) » 10年前

namari さんが書きました:>taketoshiさん
なるほど・・・これで少なくともtaketoshiさんのPCで30fpsのゲームをするとして、
x++;の処理に関しては30億回:5秒 30億回:150フレーム 2000万回:1フレームというわけで、
2000万回以下までは問題なくできそうになるわけですね。

しかし、taketoshiさん、softya(ソフト屋)さんの仰る通り、いくつもの要素で左右されるようですね。
結論としては、要求する最低スペックのPCで、今回行なう作業に関するtaketoshiさんのようなテストを行ない、(x++;を行う処理を他の処理に書き換えて)
上記のような計算から、大丈夫そうな回数の見積もりを立てるぐらいでしょうか・・・。
それでもsoftya(ソフト屋)さんの仰る通り、かなり誤差が大きそうなので、何回か試行を行ない、
その見積りから相当数小さくした値が安全に動作するだろう値といったところでしょうか。
私からの意見は、ほぼ本物のゲームコードで検証しないと殆ど意味が無いです。
あとGPUの処理も絡むのでCPUだけで判断は意味が無いですよ。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

taketoshi
記事: 222
登録日時: 13年前
住所: 日本国

Re: PCは一体一瞬の間にどれほどの処理を行えるのか。

#9

投稿記事 by taketoshi » 10年前

製作中のSRPGで移動範囲を求める際に再帰関数を用いました。
2000万回も計算していないと思うのですが明らかに処理が止まった経験があります。
その時は無駄な演算をスルーするように実装し時間短縮を図りました。

>私からの意見は、ほぼ本物のゲームコードで検証しないと殆ど意味が無いです。
上記の経験から私もそう感じます。
結果を維持したまま軽いコードを書くというのも大事です。

アバター
みけCAT
記事: 6734
登録日時: 13年前
住所: 千葉県
連絡を取る:

Re: PCは一体一瞬の間にどれほどの処理を行えるのか。

#10

投稿記事 by みけCAT » 10年前

taketoshi さんが書きました:製作中のSRPGで移動範囲を求める際に再帰関数を用いました。
2000万回も計算していないと思うのですが明らかに処理が止まった経験があります。
その時は無駄な演算をスルーするように実装し時間短縮を図りました。
再帰関数は計算量の見積もりが難しいと言われています。[要出典]
おそらく、一度見たところを何度も見たのではないですか?
例えば、何も考えずに4方向に動く場合、N回動けるとすると1回の移動で4通り動けるので、
O(4^N)かかることになり、N=12で10,000,000を超えます。
taketoshi さんが書きました:>私からの意見は、ほぼ本物のゲームコードで検証しないと殆ど意味が無いです。
上記の経験から私もそう感じます。
結果を維持したまま軽いコードを書くというのも大事です。
例えば、今流行りの[要出典]これですね。
新人女子プログラマの書いたコードを直すだけの簡単なお仕事です!|paizaオンラインハッカソンVol.1
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

taketoshi
記事: 222
登録日時: 13年前
住所: 日本国

Re: PCは一体一瞬の間にどれほどの処理を行えるのか。

#11

投稿記事 by taketoshi » 10年前

>>みけCATどの

正にご指摘の通りでした。
一度見たところを何度も上から計算していたので、
別途マス目をチェックしたかの配列を用意して
チェック済みならばそれ以降の処理をスキップするように実装しました。

・・・1000万超えてたんですね。

閉鎖

“C言語何でも質問掲示板” へ戻る