![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?e8efa67)
![](http://oshiete.xgoo.jp/images/v2/common/profile/M/noimageicon_setting_02.png?e8efa67)
unsigned short型の配列から別のunsigned short型の配列へ、データをコピーするときに、オーバーヘッドを少なく、いかに処理時間を高速にデータをコピーするかというお話です。
たとえば↓のようなデータがあったとします。
unsigned short a[100],b[100];
配列aから配列bへどのようにしたら、高速にメモリコピーできるんでしょうか?
memcopyを使用すると一番手っ取り早いのですが、ものすごくオーバーヘッドが高いと聞きます。memcopyを行うとどのような処理をしているのでしょうか?
memcpyを使用しないなら、for文を使って
for(i=0;i<100;i++){
a[i]=b[i];
}
と私はしてしまいたいのですが、知人曰く、メモリアクセスには時間がかかるので避けたいとのことでした。
たとえば、aからbへの代入に一旦ポインタを使用して、double型でキャストして代入を行い、メモリアクセスの回数を減らして、for文のループも減らすという対策も出来るとおもいますが、一体どれが一番高速にaからbへデータをコピーできるのでしょうか?
a[100],b[100]としましたが、サイズは任意です。大きい場合もあるし、小さい場合もあります。
なにか良いアイデア&memcopyの内部処理などを知っている方いましたら、教えてください。
No.4ベストアンサー
- 回答日時:
推測ですが、インテルの石では、中心部分は大体こんな感じではないですか。
RISCチップやモトローラはわかりません。インテル一筋なもんで。MOV EAX,CS
MOV DS,EAX
MOV ES,EAX
POP SI
POP DI
POP ECX
CLD
REP
MOVSB
このソースの前後にCライブラリ特有の処理が必要になります。
ただ、関数のオーバーヘッドが気になるのでしたら、全体のアルゴリズムを見直して、データ転送ではなく、ポインタを使うようにしたほうがいいと思います。
丁寧なご回答どうもありがとうございます。
実はこのプログラムは特定機器向け用に知人がC言語で作っている最中で
高速化をはかるために、ほとんどのアルゴリズムの改良を行なったらしいです。
で、残りはこの部分のみとのことでした...。
入出力は外部かららしく、それを自分のところのどうしてもポインタを使用せず、
メモリにコピーをしたいらしいです。
memcopyを使用せずに、高速にコピーできる方法で、
なにか良いアイデアありませんか~??
あったらどうぞよろしくお願いいたします。
No.6
- 回答日時:
>実はこのプログラムは特定機器向け用に知人がC言語で作っている最中らしいです。
>先ほどその知人に聞いたところ、memcopyは使用できないとのことでした...。
memcopyも実装されてないような特定機器の話なら、こんな一般論的な質問をしても解決しないと思います。コンパイラの最適化能力もわからないし。具体的な機器名やコンパイラ名を書くと、それを知っている人なら回答できるかも。
ご回答、ありがとうございます。
実は知人からの相談なので、まったく環境がわかりません。
わかりましたら、お知らせしたいと思います。
No.5
- 回答日時:
『車輪を再発明してはいけない』
ソフトウェア工学ではよく言われる言葉ですが、その言葉には「効率を追い求めるだけのために標準ライブラリを再開発するな!」という意味が含まれます。
あえて車輪の再発明を望むならCPUのアーキテクチャ、CPUに内蔵されていないデータキャッシュのアルゴリズム、メモリBUSの仕様、仮想記憶のアルゴリズム、ページングデータセットのサイズなどなど考慮すべきポイントが山ほどあります。
少なくとも処理系依存の標準ライブラリはこれらを考慮して実装されているはずだからです。
ありがとうございます。
とりあえず、私のレベルではどうにもならなそうです。
でも、とても参考になりました。
どうもありがとうございました。
No.3
- 回答日時:
アセンブラで書くのが早くなると言う話を
聞きました。
データの形がはっきり決まっているなら
アセンブラの形の出力をつくり
それから、一つ一つの演算の速度表と
回数を見て調整するのかな?
以前、私が書いたソフトと商売用に直して使っていた
友人がそのようなことをいっていました。
でも、私はmemcpy() を使います。
この時間が問題になるなら新しいコンピュータにすれば
速度の問題はすぐ解決するからです。
それに、簡単だし!!
ご回答どうもありがとうございます。
実はこのプログラムは特定機器向け用に知人がC言語で作っている最中らしいです。
先ほどその知人に聞いたところ、memcopyは使用できないとのことでした...。
マシーンのスペックも決まっているとのことです。
memcopyを使用せずに何か良いアイデアありませんか~?
よろしくお願いします。
No.2
- 回答日時:
>memcopyを使用すると一番手っ取り早いのですが、ものすごくオーバーヘッドが高いと聞きます。
そうなんですか?
できる限り高速化されてるはずなんですけどね。
ループなんかよりずっと速いはずなんですけど。
>memcopyを行うとどのような処理をしているのでしょうか?
コンパイラ依存でしょうね。
VC++であれば、Cランタイムのソースも付属しているので中を確認することもできます。
おそらくアセンブラを使用していると思われますが。
ご回答どうもありがとうございます。
memcopyがオーバーヘッドが高いと知人が言っていたので、
本当かどうかは確かめていません。
しかし、それは依存するものだということを知れただけでも
大きな収穫です。どうもありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・ゆるやかでぃべーと タイムマシンを破壊すべきか。
- ・「I love you」 をかっこよく翻訳してみてください
- ・歩いた自慢大会
- ・許せない心理テスト
- ・字面がカッコいい英単語
- ・昔のあなたへのアドバイス
- ・かっこよく答えてください!!
- ・あなたが好きな本屋さんを教えてください
- ・スタッフと宿泊客が全員斜め上を行くホテルのレビュー
- ・【大喜利】【投稿~8/27】 こんなガソリンスタンド二度と来るか!なぜそう思った?
- ・これ何て呼びますか Part2
- ・人生で一番思い出に残ってる靴
- ・【お題】動物のキャッチフレーズ
- ・【お題】甲子園での思い出の残し方
- ・ゆるやかでぃべーと すべての高校生はアルバイトをするべきだ。
- ・「それ、メッセージ花火でわざわざ伝えること?」
- ・自分用のお土産
- ・人生で一番お金がなかったとき
- ・一番好きなみそ汁の具材は?
- ・泣きながら食べたご飯の思い出
- ・ちょっと先の未来クイズ第1問
- ・ゴリラ向け動画サイト「ウホウホ動画」にありがちなこと
- ・初めて自分の家と他人の家が違う、と意識した時
- ・単二電池
- ・チョコミントアイス
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
アセンブラからC言語に変換する...
-
ライン数とステップ数の違いは?
-
実行ファイルからソースはみれる?
-
[C言語→アセンブリ言語]はどう...
-
PICのアセンブラからC言語へ変...
-
アセンブラの擬似命令について
-
データコピー
-
SHの命令の意味について
-
MASMの機種依存についてお尋ね...
-
PC-9801でマシン語を学習するに...
-
8ビットのデータの、先頭ビット...
-
0xffffとは?
-
エクセルVBAのIf,Then 構...
-
昔のゲーム製作に使用する言語...
-
03分22秒36のような時間の単位...
-
一般のソフトで画像を扱う場合...
-
符号無し整数xを右にnビット回転
-
1の補数
-
情報科学の飽和演算、ラップア...
-
if($a & $b) の意味
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
アセンブラからC言語に変換する...
-
ライン数とステップ数の違いは?
-
実行ファイルからソースはみれる?
-
PC-9801でマシン語を学習するに...
-
void __cdeclなど_
-
[C言語→アセンブリ言語]はどう...
-
アセンブラwordという単位
-
アセンブラ言語がわかりません。
-
バイナリの実行ファイルをgccを...
-
SHの命令の意味について
-
PC-9801 MS-DOSでの実行ファイ...
-
PICに書き込むプログラムや変数...
-
PICのアセンブラからC言語へ変...
-
アセンブラのLA
-
アセンブラエディタ
-
【H8マイコン】HEWで埋め込みア...
-
ニーモニックコードを使って割...
-
アセンブラのコマンドについて
-
7セグメントLEDの点灯について
-
MASMの機種依存についてお尋ね...
おすすめ情報