ちょっと変わったマニアな作品が集結

キャッシュを意識した高速なプログラムの打ち方を教えてください。
具体的にどうすればいいのか教えてほしいです。

よろしくおねがいします。

このQ&Aに関連する最新のQ&A

A 回答 (7件)

Windows限定と言うか汎用的なx86系CPU限定で良いんでしょうか?


回答番号:No.3さんの回答に似てるんですが、

[命令キャッシュ]
(1)if文のelse/switch等の分岐を避ける。特に大きなコードを含んだ分岐で飛び越すのは避けた方がよい。
(2)処理の回数や時間が長い処理を出来るだけif文の条件が真になる時に通るようにする。
(3)関数やクラスの呼び出しを極力避ける。呼び出す場合は出来るだけ戻ってこない時間の掛かる処理にする。

[データキャッシュ]
(1)データは極力シーケンスにアクセスする。ランダムアクセスする場合も広範囲にアクセスしないように工夫する。
(2)データのアクセスとアクセスは出来るだけ間隔を空けて、レジスタ内で処理をするコードを心がける。
(3)スレッドなどCPUコア間で同期が必要な処理は避ける。データキャッシュのフラッシュが起こる可能性があるため。

上と合わせて、コンパイラ出力のアセンブラレベル命令コードを毎回確認して、無駄なコードが出ていないか確認する。

まぁ、今時のCPUでキャッシュばかり意識し過ぎるとプログラムの可読性が低いやら、結局処理が遅いとか、開発効率が悪すぎるとか、あまりメリットが無いかもしれません。
    • good
    • 0
この回答へのお礼

具体的でわかりやすいです。
返答ありがとうございました。

お礼日時:2009/02/19 01:59

レジスタの積極的な利用を考えるのなら


64ビット化が最も有力と考えます、

使えるレジスタ数そのものが増えるためです。
関数のパラメータもできるだけレジスタ渡しを採用するようになります。

従来の __fastcallに似ています。
ただし、x86ではレジスタ数そのものが少ないので
効果は?な部分もありました。
    • good
    • 0
この回答へのお礼

返答ありがとうございました。

お礼日時:2009/02/19 02:01

> どんなプログラムの場合の高速化なのかといったことは限定せず


> 広くキャッシュにヒットしやすい、キャッシュに適した、
> 高速なコードの書き方を求めています。

一般論であれば、

・可能な限り、プログラムサイズを小さくする。

ことぐらいです。
サイズを縮小するには、単に最適化オプションを調整するだけでなく、ソースコードレベルでの調整も必須になります。
    • good
    • 0
この回答へのお礼

返答がりがとうございました。

お礼日時:2009/02/19 02:00

どのような理由で”キャッシュを意識"する必要があるのかわかりませんが,


一般論としては、あまり意味がないと考えています。
最適化オプションで"コードサイズを優先"にすれば、
かなりコンパクトになり、キャッシュに入る可能性も上がるのではないでしょうか?

本当にキャッシュを意識したいなら
まず、ターゲットのCPUを定めなくてはなりません。
同じIntel製のCPUでも
Pentium Dの場合
Core Aのキャッシュに入っているデータをコアBが直接アクセスできず
メモリを介した転送になるので、キャッシュのメリットを享受できません。
Core2Duoならば、キャッシュが共有されていますので
そんな心配は要りません。

このことは、マルチ・スレッドで初めて問題になることで
シングル・スレッドでは関係ないとも言えます。

ただ、CPUを意識しないと、キャッシュを活用したつもりでも
落とし穴にはまることがある一例として挙げさせていただきました。

キャッシュを意識する以前に効率化を検討する必要があると考えます。
こういった問題をわかりやすく取り上げた本として

"Effeective C++"
"more Effective C++"

を推薦します。
    • good
    • 0
この回答へのお礼

マルチ・スレッドもキャッシュを意識する上で重要ですよね
返答ありがとうございます。

お礼日時:2009/02/19 01:57

>キャッシュを意識した高速なプログラムの打ち方



オートや動的確保の変数、オートや動的確保のクラスオブジェクト、クラス関数、関数などを極力用いないようにする。

変数はすべてグローバル変数にして、良く使う変数は、物理的に近い位置に配置する。

つまり、C++などは使わず、Cを使うのが「大前提」となる。
    • good
    • 0
この回答へのお礼

返答ありがとうございます。
参考にしたいと思います。

お礼日時:2009/02/16 23:41

あと、どんなCPUコア限定にするかの情報も欲しいですね。


CPU毎に癖がありますから。
    • good
    • 0

> 具体的にどうすればいいのか教えてほしいです。



具体的にどんなプログラムなのか、
具体的にどんな処理系(プラットフォームおよびコンパイラ)なのか、
具体的に現在どの程度の時間がかかっていて、どの程度高速化したいのか、

以上を補足してください。

この回答への補足

ごめんなさい。
どんなプログラムの場合の高速化なのかといったことは限定せず
広くキャッシュにヒットしやすい、キャッシュに適した、
高速なコードの書き方を求めています。
VisualC++で開発しています。

情報が少なく答えることができないのであればその場合は
ごめんなさい。返答ありがとうございます。

補足日時:2009/02/16 23:29
    • good
    • 0

このQ&Aに関連する人気のQ&A

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

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QLNK2019: 未解決の外部シンボルのエラーが出る

Microsoft Visual Studio 2008
Version 9.0.21022.8 RTM
Microsoft .NET Framework
Version 3.5 SP1
----------------------------------------------------------------
新しいプリジェクト→Win32 コンソール アプリケーション(ソリューションのディレクトリを作成 チェック外す)→Windows アプリケーション(空のプロジェクト チェック外す)
----------------------------------------------------------------
 プログラム

 mymain.cpp
#include "myhelper.h"
#include "mymain.h"

//自キャラのデータ
Point2D g_jikipos = {40, 400};//自キャラの座標

//画像ハンドル
int g_jikiimage[11];

//色々なファイルの読み込み
int LoadFiles(){
//画像ファイル読み込み
if(LoadDivGraph("media\\player01.bmp",
11,11,1,64,64,g_jikiimage) == -1) return -1;

return 1;
}


 mymain.h
//他から呼び出させるMyMainの関数
void MyMain();
int LoadFiles();


 myhelper.h(サンプルなので打ちミスはない)
#include "DxLib.h"
#include <limits.h>
#include <math.h>

//構造体宣言
//座標またはベクトルを記録する構造体
struct Vector{
float x,y;
};
typedef Vector Point2D;
//線を記録する構造体
struct Line2D{
Point2D startpos, endpos;
float katamuki;//傾きをラジアン値で記録
Vector speed;//移動している場合は速度をセット
};
//球体を記録する構造体
struct Ball2D{
Point2D position;
float hankei;//半径
};
//四角形を記録する構造体
struct Rect2D{
Point2D lefttop;
Point2D rightbottom;
float width;
float height;
};


//ライブラリ関数
Point2D PosInView(Point2D in);
int XInView(float inx);
int YInView(float iny);
void ScrollToLeft(float jikiposx);
void ScrollToRight(float jikiposx);
void ScrollToUp(float jikiposy);
void ScrollToDown(float jikiposy);
void DrawLineInView(float x1, float y1, float x2, float y2, int Color, int Thickness);
void DrawCircleInView(float x, float y, float r, int Color, int FillFlag);
void DrawAnimation(float x, float y, double ExtRate, double Angle,int TurnFlag,
int *imgarray, int allframe, float fps);
//ベクトル関数
Vector CreateVector(Vector in, float veclen);
Vector AddVector(Vector v1, Vector v2);
Vector SubVector(Vector v1, Vector v2);
Vector AddVectorInFrameTime(Vector pos, Vector speed);
Vector AddVectorInFrameTime2(Vector pos, Vector speed, Vector accel);
Vector Normalize(Vector in);
Vector RotateVector(Vector in, float radian);
float VectorLengthSquare(Vector in);
float DotProduct(Vector v1, Vector v2);
float CrossProduct(Vector v1, Vector v2);
void SetLine2DKatamuki(Line2D *in);
void DrawLine2D(Line2D in, int Color, int Thickness);
void DrawBall2D(Ball2D in, int Color, int Fill);
//当たり判定関数
bool HitTestLineAndBall(Line2D linein, Ball2D ballin);
bool IsPointAtLineFace(Line2D linein, Point2D ptin);
bool HitTestLineAndLine(Line2D line1, Line2D line2);
bool HitTestBallAndBall(Ball2D a, Ball2D b);
bool HitTestPointAndBox(Rect2D rect, Point2D pt);
//タイマー関数
void SetSimpleTimer(int idx, int time);
int GetPassedTime(int idx);


//グローバル変数
extern float g_frametime;
extern Rect2D g_framerect;//画面領域(当たり判定)
extern Point2D g_current_field_pos;//現在の左上座標
extern Rect2D g_stagesize;//ステージサイズ

//定数宣言
const float ZEROVALUE = 1e-10f;
const float PIE = 3.1415926f;
const int SCROLL_LIMIT = 200;
----------------------------------------------------------------
 エラー内容
1>myhelper.obj : error LNK2019: 未解決の外部シンボル "void __cdecl MyMain(void)" (?MyMain@@YAXXZ) が関数 _WinMain@16 で参照されました
1>C:\Documents and Settings\Owner\My Documents\Visual Studio 2008\Projects\my\Debug\my.exe : fatal error LNK1120: 外部参照 1 が未解決です
1>my - エラー 2、警告 0
ビルド: 0 正常終了、1 失敗、0 更新不要、0 スキップ
----------------------------------------------------------------
画像を貼り付けときます
(見えにくい場合→http://www.dotup.org/uploda/www.dotup.org154142.jpg.html)
初心者なのでわかりやすくお願いします

Microsoft Visual Studio 2008
Version 9.0.21022.8 RTM
Microsoft .NET Framework
Version 3.5 SP1
----------------------------------------------------------------
新しいプリジェクト→Win32 コンソール アプリケーション(ソリューションのディレクトリを作成 チェック外す)→Windows アプリケーション(空のプロジェクト チェック外す)
----------------------------------------------------------------
 プログラム

 mymain.cpp
#include "myhelper.h"
#include "mymain.h"

//自...続きを読む

Aベストアンサー

ファイル構成から推測するに
mymain.cpp というファイルに
void MyMain(void) {
// ここに処理を書く
}
という関数が必要なようです。

Qファイルやディレクトリの存在確認を行う方法

ファイルをオープンするのはfopenでOKですが、ファイルやディレクトリの存在確認を行う方法が知りたいです。

何か組み合わせて作るものなのでしょうか?
perlとか便利な演算子があるのですが、C/C++って器用ではないですね。
これは処理系?依存の内容ですか?

私の環境は VC6, VC2005 Windows2000です。

Aベストアンサー

int access(const char* path, int mode);
int stat(const char* path, struct stat* sb);

かな?
MSDN を引くと _access_s() を使えとか書いてあるけど。

Qキャッシュとバッファの違いは?

はじめまして
キャッシュとバッファの違いがよくわからないので
教えてください。

初歩的な質問だと思いますがこちらの方の方がわかる方が多いと思いますのでよろしくお願いします。

Aベストアンサー

両方、物理的にいえばメモリです
意味合いとしても両方、記憶領域になります。

キャッシュは、使用頻度の高いデーターを蓄えておき、即時実行できるようにするメモリ

バッファは、処理速度や転送速度の差を補うためにデータを一時的に保存しておくメモリ

Qファイル出力の場所を指定

現在C++にてhtmlファイルを出力するプログラムを作っているのですが、出力場所を指定することはできるのでしょうか?(現在はそのプログラムソースが保存されている場所と同じファイル内に出力されますが、それをデスクトップに出力するなど。)
もし、方法がありましたら、教えてください。
ソースや参考HPのURLなどのせていただけたらありがたいです。
環境はVisualStudio.NET2003です。
よろしくお願いします。

Aベストアンサー

単にファイル名の前にパスを指定する。

絶対パス指定
fp=fopen("c:/temp/test.txt","w");

相対パス指定
fp=fopen("./hoge/test.txt","w");


デスクトップはOSやユーザによって場所が異なるので、少し面倒です。
XPの場合環境変数を利用してこんな感じで出来ると思います。

例:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

void main(void)
{
FILE *fp;
char fname[1024];
strcpy(fname,getenv("USERPROFILE"));
strcat(fname,"/デスクトップ/test.txt");
fp=fopen(fname,"w");
//処理
fclose(fp);
}

Qラップ関数とはどんなものですか?

プログラミングの際に最近「ラップ関数」というのを良く耳にします。実際の所、あまり良く意味が分かっていません。

ラップ関数とは、分かりやすく言うとどんなものなのでしょうか。
あまりプログラミングの経験が無いので、専門的な言葉はあまり使わずに簡単に説明してもらえると有難いです。よろしくお願いします。

Aベストアンサー

a-bを計算してくれる2つの関数があるとします。
int hikizan1(int a, int b){return a-b;}
float hikizan2(float b, float a){return a-b;}

どちらも似ているのですが、引数の順番が違うので、hikizan2をhikizan1と同じように使うと、答えがa-bでなくb-aになってしまいます。注意して使う必要があり、何かと不便です。
そこで、hikizan2を呼ぶ関数
float hikizan3(float a, float b){
  return hikizan2(b,a);
}
を作りました。
hikizan2を使う代わりにhikizan3を使えば、hikizan1と同じ使い方で正しくa-bを計算できるようになります。

この例は引数の順番を変えていますが、それに限らず、何らかの理由により関数の使い方を変えたい場合に作るのがラップ関数です。
ラップ関数を呼んだ場合、実際にはもとの関数が呼ばれますので、元の関数を包んだ(ラップした)ラップ関数と呼ばれます。

a-bを計算してくれる2つの関数があるとします。
int hikizan1(int a, int b){return a-b;}
float hikizan2(float b, float a){return a-b;}

どちらも似ているのですが、引数の順番が違うので、hikizan2をhikizan1と同じように使うと、答えがa-bでなくb-aになってしまいます。注意して使う必要があり、何かと不便です。
そこで、hikizan2を呼ぶ関数
float hikizan3(float a, float b){
  return hikizan2(b,a);
}
を作りました。
hikizan2を使う代わりにhikizan3を使えば、hikizan1と同じ使い方で正...続きを読む

Q計算速度の速いC言語を教えてください!

C++、C++/CLI、C#のどれかを初めて勉強しようと思っているのですが、どの言語を学んだらよいでしょうか?
主にやりたいことは、スプレッドシート上での計算を数千万回繰り返す計算とグラフ描写です。

これまでVBAを使って為替相場の価格変動をシミュレートするプログラムを組んで、4万行の計算x300回程度の計算をずっとしてきました。ただ、EXCELのグラフ機能に不満なので、計算とグラフ描写もするソフトを自分で作ろうと思っています。VBAは基本的な構文(For,If, Whileなど)を理解して使っています。プログラミングはVBA以外に触れたことがないのですが、永くコンピュータと付き合いたいのでC言語を新しく勉強したいと思ってます。

そこで教えて頂きたいのですが、C++、C++/CLI、C#のどれを勉強するのがよいでしょうか?上記のような計算をした時に速度に大きな違いが出るのでしたら速い言語を勉強したいです。 あまり違いが出ないのでしたら、上記のような目的のソフトをWindows上で趣味として作り、末永く付き合える言語を教えてください。 ちなみに上記のような計算で、VBAでは10時間程度かかります。

質問が長くなってしまってすいません。C言語をご存知の方、ご教授くださいm(_ _)m

C++、C++/CLI、C#のどれかを初めて勉強しようと思っているのですが、どの言語を学んだらよいでしょうか?
主にやりたいことは、スプレッドシート上での計算を数千万回繰り返す計算とグラフ描写です。

これまでVBAを使って為替相場の価格変動をシミュレートするプログラムを組んで、4万行の計算x300回程度の計算をずっとしてきました。ただ、EXCELのグラフ機能に不満なので、計算とグラフ描写もするソフトを自分で作ろうと思っています。VBAは基本的な構文(For,If, Whileなど)を理解して使っています。プログラ...続きを読む

Aベストアンサー

#1さんのおっしゃるように、スピードを求めるなら普通のC言語で計算させるのが(現実的には)いちばんです。C言語とC++とでは、場合によっては100倍以上の速度の違いが出ることもあります。ただしこれは最悪の場合であって、普通に使う限りはほとんど変わらないと考えてください。
C#やC++/CLIと言った .NET 系の言語は、ネイティブ環境(≒C言語やC++)と比較して実質80~90%程度の速度が出るそうです。
が、そもそもVBAだから十時間もかかるのであって、C言語でもC++でもC#でも、恐らくその1000分の1の時間で計算できてしまうでしょう。
このあたりの言語を使うなら、スピードは実質的に変わりません。

さて、グラフ描写をしたいということですので、私がおすすめする環境は二種類あります。

・C言語など + gnuplot
C言語などで計算して、gnuplotでグラフを描画させます。
gnuplotはグラフを描くための専用のGNUツールです。Excelなんかと比較すれば取っつきにくいですが、普通に描きたいグラフならまず描けるだけの幅広さを持っています。誤差やベクトル図なんかも描けますし、
discourageするようですが、グラフツールを自作する必要は恐らくありません。gnuplotがあれば十分のはずです。
http://t16web.lanl.gov/Kawano/gnuplot/intro/style.html
candlesticksの項なんかは特に株関係で使えそうですね。

・R(あーる)
統計処理用の言語(処理系)であるRです。Rの一文字だけで検索できるほど使われている言語です。
http://aoki2.si.gunma-u.ac.jp/R/
こちらは計算もグラフ描きも一つの言語で出来るところが魅力です。おまけにライブラリも豊富なので、使いたいと思う計算アルゴリズムも大抵があらかじめ用意されています。レーダーチャートなども描けてしまいます。

最後に、永くつきあえるものという話ですが、言語は変わっていくものなのであまりそういう期待は出来ません。
それでも敢えて言うなら、Pythonですね。
.NET 上でも IronPython が動きますし、他のOSに移ってもおおよそそのまま使えます。速度もせいぜいCやC++の10倍程度ですし、低レイヤも扱えるなどスクリプト言語として優れています。
.NET を知りたいなら C# がいちばん良いと思いますが、どこまでWindows天下か分かりませんから、永く付き合うとなると必ずしもおすすめできません。

教養としてならC言語はやっておいて損のない言語ですが、じっさいに計算などさせる目的ならPerlやRubyやPython、Rなどの方が圧倒的に扱いやすいです。

#1さんのおっしゃるように、スピードを求めるなら普通のC言語で計算させるのが(現実的には)いちばんです。C言語とC++とでは、場合によっては100倍以上の速度の違いが出ることもあります。ただしこれは最悪の場合であって、普通に使う限りはほとんど変わらないと考えてください。
C#やC++/CLIと言った .NET 系の言語は、ネイティブ環境(≒C言語やC++)と比較して実質80~90%程度の速度が出るそうです。
が、そもそもVBAだから十時間もかかるのであって、C言語でもC++でもC#でも、恐らくその1000分の1...続きを読む

Q戻り値で構造体を返すことは可能でしょうか?

perlでは以下のように2つの戻り値が可能ですが、C言語では
それができるのでしょうか?
my (ret1, ret2) = test1();

よくやるのは、引数にポインタを渡して、内容を書き換える手を使っていますが、戻り値を複数返せたら、直感的にわかりやすいかなと思いまして・・・

Aベストアンサー

C言語から遠く離れた者ですが、

>>> よくやるのは、引数にポインタを渡して、内容を書き換える手を使っています

これが常識でしょう。これが直感的に理解できるようにC言語を身に付ける必要があるのではないでしょうか。

QC++とVC++の違いについて

この質問をご覧頂きありがとうございます。

みなさんに2つ、お聞きしたいことがあり、質問させていただきます。
1.C++とVC++とでは、どのくらいの違い(どういう違い、特徴)があるのでしょうか?

2.また、これからC++/VC++でプログラミングを始めようとした場合、
C++からVC++へと段階を踏んで勉強した方がよいのでしょうか?

一応、私のプログラミングの履歴としては、
言語としてVisual Basicは多少勉強はしておりました。
また、オブジェクト指向の基礎程度(多相、継承、カプセル化)は理解しています。

抽象的な質問で大変恐縮なのですが、
みなさんの経験論や、ご参考にした本、HP等がありましたら、
ご教授いただければと思います。

Aベストアンサー

こんにちは、honiyonです。
 VC++ は、Microsoftの発売している C++開発環境です。 純正C++に加え、独自に機能(という言い方でいいのかな?)を追加しており、更に開発しやすいソフト(環境)を添付してあります。

 VC++に限らず、大体はそうです。 ProC++も、Borland C++も皆そうです。
 今までお使いになっていた VBも、BASICコンパイラ+開発環境です。 
 こちらの場合、BASICに機能を追加・・・というより仕様そのものを大幅いじってますね(笑)

 VC++をただ単純に C++として使用するなら良いですが、VC++とMFCを使用してウインドウアプリケーションを作りたいという事であれば、死に物狂いな勉強が必要が必要かもしれません。Windowアプリケーションの処理プロセスを理解していないと、とっても難解に感じると思います。
 VC++でなければいや!という理由がなく、Visual Basicからスムーズに移行でき、かつVisual Basicより奥の深い事をしたい、というならば C++ Builder をお勧めします。 こちらで腕を慣らし、徐々にWindowアプリケーションの処理プロセス(WinMainから始まるプログラムの組み方の事です)を学ぶと良いかな、と思います。 その上で VC++&MFCな環境に移行すると、敷居はぐっと低くなります。
 私は一度VC++&MFCに挫折しましたが、こちらの方法で何とか理解する事が出来ました(^^;

 参考になれば幸いです(..
 

こんにちは、honiyonです。
 VC++ は、Microsoftの発売している C++開発環境です。 純正C++に加え、独自に機能(という言い方でいいのかな?)を追加しており、更に開発しやすいソフト(環境)を添付してあります。

 VC++に限らず、大体はそうです。 ProC++も、Borland C++も皆そうです。
 今までお使いになっていた VBも、BASICコンパイラ+開発環境です。 
 こちらの場合、BASICに機能を追加・・・というより仕様そのものを大幅いじってますね(笑)

 VC++をただ単純に C++として使用するなら良いで...続きを読む

QC言語で、数値の桁数を求めるには??

C言語で数値の桁数を求めるプログラムをもとめたいのですが
どうすればいいのでしょうか
int c;
int a;
c=12345;
a=printf("%d",c);

とするとaに桁数は入るのですが
cがPRINTF関数により表示されてしまいます

どうすればいいでしょうか?
わかる方はおしえてください、おねがいします。

Aベストアンサー

 sprintf 関数というのがあります。
 printf 関数とまったく同じですが、結果を変数に出力する点が違います。

 char dummy[10];
 int c, a;
 c=12345;
 a=printf(dummy, "%d",c);

 この dummy 変数には文字列 "12345" が入りますが、使わなければどうということはないです。

 C言語を使い始めてそろそろ10年になりますが、sprintf をこんなふうに使おうとは思いもしませんでした(^_^;
 なんか反則っぽいですけど、合理的ですね(笑)

 ちなみに、答えが0になるまで10で割っていって、割ることができた回数を数えるのが普通のやりかたです。

QCとFORTRANの計算速度はどちらが速いですか?

マシンスペックは同じとして、OSはUNIXであった場合、科学技術計算(微分方程式を解いたり、行列を対角化したり。。。)の計算速度はどちらが速いですか?
普通、科学計算というとFORTRANを使っていますが、これはライブラリの遺産が多いからだと思いますが、実際のところFORTRANとCではどちらが計算速度が速いのでしょうか。

Aベストアンサー

#5=#7=#8 です。

> Cのループは再起呼び出しより速度が速く
末尾再帰の話はとりあえず忘れていただくとすると、
Cに限らず、一般にプログラムはループで書けるならループで書いたほうが再帰呼び出しを使うより処理は速いですし、必要メモリ量も少なくてすみます。

> さらにFORTRANでは並列処理によって高速化が計られている
ループが高速化されるというより、ベクトル演算が高速化されるといった方が正確かもしれません。
同じループでも、微分方程式を解くときの反復演算のように、r0からr1を求めて、r1からr2を求めて、、、を繰り返すようなループは、ベクトルプロセッサを使ったところで並列化は不可能です。

ベクトルプロセッサの強みは、ベクトルの各要素の計算を一度にやってしまえる点にあります。
v = abs(v)
と書けば、vがベクトル長nのベクトルなら、n並列で絶対値の計算をしてくれるわけです。
これをC言語で、
for( i=0 ; i<n ; i++ ) v[i] = abs( v[i] );
と書いてしまうと、n回のabs関数の呼び出しを同時にやっていいのか、i=0から順番に呼び出さなければならないのかが(基本的には)わからないため、並列化できないのです。

#5=#7=#8 です。

> Cのループは再起呼び出しより速度が速く
末尾再帰の話はとりあえず忘れていただくとすると、
Cに限らず、一般にプログラムはループで書けるならループで書いたほうが再帰呼び出しを使うより処理は速いですし、必要メモリ量も少なくてすみます。

> さらにFORTRANでは並列処理によって高速化が計られている
ループが高速化されるというより、ベクトル演算が高速化されるといった方が正確かもしれません。
同じループでも、微分方程式を解くときの反復演算のように、r0からr1を求めて、r...続きを読む


人気Q&Aランキング