こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

計算速度の速い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

投稿日時 - 2008-03-24 15:21:30

QNo.3890583

困ってます

質問者が選んだベストアンサー

#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などの方が圧倒的に扱いやすいです。

投稿日時 - 2008-03-24 18:32:27

補足

beefisdead様
ご回答ありがとうございます。
それほどまでにVBAが遅いとは知りませんでした!今までVBAでやっていた自分はまるで北京原人です。
>C言語でもC++でもC#でも、恐らくその1000分の1の時間で計算できてしまうでしょう。
それだけVBAと差が出せるのであれば、計算速度の問題はクリアできそうです。まず基礎はとりあえずCで勉強しようと思います。
gnuplot,Rどちらも非常に良いツールですね。もっと自分で深く調べてみようと思います。
為替の取引会社に接続し、価格データを取り込んでリアルタイムでチャートに反映させることを将来的にやりたいとおもってます。gnuplot,R等を利用してできるかどうか、自分でも調べてみたいと思います。もしアドバイス等ありましたら教えていただけないでしょうか。

投稿日時 - 2008-03-24 21:13:57

このQ&Aは役に立ちましたか?

1人が「このQ&Aが役に立った」と投票しています

回答(6)

ANo.6

いきなり、C言語からやってはたいへんでは。

とりあえず、VBやC#などから初めて、
最短で質問のプログラムを作ってしまう。

そうすると、そのVBAの計算時間分があくので、
(少なくとも、VBAより格段にはやい)
VBやC#で作ったものをC++やC言語等に移行していく。

でも、今からCやC++を始めるのであれば、
言語としての勉強の範囲内でよいかと。

やり始めると、いろいろ問題も出てきます。
CやC++に、C#やVBなどのdecimalなんて便利な物もないし、
そうなると小数の端数に誤差も生じてくるので
自前で補正したりせねばならなくなったり。

投稿日時 - 2008-03-25 09:57:54

補足

iyaiyaview様
ご回答ありがとうございます。
>でも、今からCやC++を始めるのであれば、言語としての勉強の範囲内でよいかと。
C++があまりオススメでない理由としては、やはり開発効率でしょうか?

投稿日時 - 2008-03-25 23:11:59

ANo.5

ANo.3です。

あれこれ書くと、うんざりすると思うのですが。。。

今からCをやるのは、あまり意味がありません。
はっきり言って、時間の浪費です。
C++でスタートしていいと思います。
これは、経験者10人のうち、9人は同じことをいうでしょう。

具体的には、VC++が入りやすいと思います。
参考書が多く、関連サイトもふんだんにあります。

問題はSDKをやるかMFCをやるかです。
VC++ExpressEditionなら、マイクロソフトのサイトから無料でダウンロードできますが、MFCがついていないので、SDKになります。
過半数の人は、SDKのほうがいいと言うでしょう。
ただ、相当に難しく、根性が必要です。
MFCとSDKで、できることは同じです。
というより、MFCにしろSDKにしろ、できないことはありません。
(と、豪語しておきます)

CLIをやるのなら、C#か、VBでやるのが正確です。
VC++だと、C++でVBをやるような感じで、とってもヘンです。
ちなみに処理速度は、CLIがMFCやSDKの2~3割落ちです。

前の方が書かれている、Javaについては、私にはなんとも言えません。
日の出のjava、没落のC++みたいな部分はあります。
Javaで大抵のことは用が足りてしまうのも事実です。
ただ、為替に関して高度な計算をやろうとすると、C++のほうがいいかもしれません。

投稿日時 - 2008-03-25 08:43:44

補足

turukame2005様
度々アドバイスありがとうございます。
#3でのアドバイス頂いて、C++/CLIは候補から外すことにしました。
準備として1~2冊Cの入門書を読んで、C++かC#をやろうと思います。もしC++ならSDKをやろうと思います。

投稿日時 - 2008-03-25 23:00:36

ANo.4

C言語を勉強することを止めはしませんが。自分としては、平行して現プログラムの最適化を行うことをお勧めします。アルゴリズムの最適化は、どの言語にも有効です。たとえプログラムなどがそのまま利用できなくても、最適化の考え方が身につくと百人力です。

現行のプログラムを見てはいないので必ずとはいえませんが、VBAでも現行の物を早く実行できる可能性があります。後、移植での注意すべき点としては、現行プログラム中にExcel標準の関数(特に財務系など)を利用している場合、それらも最悪自分でプログラムする必要が出てきます。

とりあえず、処理速度アップのテクニックなど。もしすでにやられていたらすみません。
Excel VBAでワークシートや、セルへのアクセスは実行コストが高いということは知っていますか?
---------------------------------
高コスト セル(Rangeオブジェクト)
---------越えられない壁-----------
     Variant型変数
低コスト Long,Integer型変数
----------------------------------
なので、セルの中の値を一度、変数に読み込み計算後、結果のみをセルに書き込むようにすると若干、早くなります。また、セルへの書き込み中は、対象シートを非表示にすること。
セルから変数に読み込む場合、一度、セルの内容をVariant型の変数に2次配列として読み込んでから、ほかのLong、Integerなどの型の変数に設定すれば、大変、早くなります。

可変長配列は利用しない。Collectionオブジェクトを利用する。
クラスモジュールを利用する。
など、以上の物を利用することがプログラムをの効率を上げる方法です。

ちなみに、自分としては、C/C++よりも、Javaを推薦します。Javaでかき直しても、十分スピードが出るでしょう。イメージの作成も楽だし。C/C++ではイメージ作成は標準ではない、プラットフォーム(OS)依存となるので。

投稿日時 - 2008-03-25 01:11:57

補足

LunaSun様
ご回答ありがとうございます。
具体的な方法ありがとうございます。いくつかは実行していたのですが、クラスモジュールはまだ使ったことがありませんでした。
Javaは広く使われているみたいですけど、新しくJavaを始めるならC#の方が得だと思っていました。

投稿日時 - 2008-03-25 22:54:21

ANo.3

CとC++の違いはご存じですか。

処理速度を重視するなら、CかC++ですが、今どきCなどはやりませんから、C++ということになります。
もともとCが高速処理のための言語ですから、VBAなどは比較になりません。
正確に言うと、一般的なのは、マイクロソフトのVisualC++を買って、その中の、SDKかMFCをやることです。
殆どの人は、SDKを薦めるでしょうが、相当に難しく、覚悟が必要です。
挫折しては、元も子もないので、私はMFCのほうがいいと思います。
それでも、VBAよりはるかに難解です。
もちろん、MFCの基本を理解していれば、SDKも入りやすいです。

C++/CLIは感心しません。
ちょっと気の利いたことをやろうとすると、その都度ネイティブコードの出番になって、うんざりします。
なんのためのマネージコードか、さっぱり分かりません。
マイクロソフトはC++/CLIに誘導したいようですが、世の中はマイクロソフトのために成り立っている訳ではありません。
権力ボケしたのではないかと思います。

あと、処理速度は、言語だけでなく、PCのクロックにもよります。

投稿日時 - 2008-03-24 18:43:40

補足

turukame2005様
ご回答ありがとうございます。
C++/CLIは下の記事読んでかなり気持ちが傾いてたんですけど、そういう短所があったんですか。勉強不足でした。
http://www.atmarkit.co.jp/fdotnet/special/cppcli/cppcli_01.html

PCの環境はXP,Pentium4,1.8gHz,512Mbです。

みなさんのご意見参考にして、まずはCの入門を勉強してそれからC++に移行しようと思います。開発環境はTurboC++かVC++ExpressEditionがいいと思うのですが、ごく初期の入門者が使うにはどちらが良いと思いますか? ご存知でしたらご意見をお聞かせください。

投稿日時 - 2008-03-24 21:58:51

ANo.1

> C++、C++/CLI、C#

まず、これらはいずれもC言語ではありません。

計算速度の速さを求めるのであれば、普通のC言語にするのが一番です。
C++でも熟練すれば同等以上のパフォーマンスを引き出すことができますが、不慣れな状態ではあまり高速なプログラムは書けないかもしれません。いずれにせよ、効率重視のプログラミングを目指すなら、C++を使う場合でもC言語から入る方がよいでしょう。

> ちなみに上記のような計算で、VBAでは10時間程度かかります。

最初、プログラミングに10時間かと思ったのですが、実行に10時間ということですね。それなら、C言語で実装すれば桁違いに速くなると思います。
ただし、C言語で扱いやすいように、ExcelのデータはCSVかタブ区切りにでも変換しておいた方がよいでしょう。
グラフ表示は何ともいえませんが、自分で実装するにはそれなりに手間ですので、覚悟してください。

投稿日時 - 2008-03-24 16:49:50

補足

jacta様
ご回答ありがとうございます。
はい、仰るとうり1setの実行に10時間程度です。本当はもっと回数を増やしたいのですが、実行時間が長すぎるためその程度に抑えてます。
C言語ですか。C++, C++/CLI, C# を考えていたのですが、やはりCから入るのが急がば回れ的でしょうかね。Cで基礎を積んでみようと思います。

投稿日時 - 2008-03-24 21:02:22

あなたにオススメの質問